13 กันยายน 2555

[Android Code] การทำให้ List View แสดงค่าจากฐานข้อมูลแบบวนลูป [Endless Scrolling List View]


บทความนี้ก็ไม่ขอพูดถึงอะไรมากนัก อยากรู้รายละเอียดก็อ่านบทความเก่าได้ที่

จากเดิมที่เจ้าของบล็อกให้ดึงค่าจาก String[] มาแสดงบน ListView
ทีนี้ก็เปลี่ยนมาดึงจากฐานข้อมูลแทน เพราะน่าจะมีคนใช้แบบนี้มากกว่า
ก็ขอข้ามไปเป็นโค๊ดเลยละกัน เพราะแก้ไขจากของเดิมนิดหน่อย


Main.java
package app.akexorcist.listviewendlessloopdatabase;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AbsListView.OnScrollListener;


public class Main extends Activity {
    SQLiteDatabase mDb;
    MyDbHelper mHelper;
    Cursor mCursor;
    
    ArrayList<String> arr_list;
    int first_row, last_row, total_row = 40;
    ListView lv; 
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mHelper = new MyDbHelper(this);
        mDb = mHelper.getReadableDatabase();
        //mHelper.onUpgrade(mDb, 1, 1);

        mCursor = mDb.rawQuery("SELECT " + MyDbHelper.COL_NAME 
                + " FROM " + MyDbHelper.TABLE_NAME, null);
        
        arr_list = new ArrayList<String>();
        first_row = mCursor.getCount() - 1;

        while(first_row < 0) {
            first_row += mCursor.getCount();
        }
        
        for(int i = 0 ; i < total_row ; i++) {
            mCursor.moveToPosition(first_row);
            arr_list.add(mCursor.getString(mCursor.getColumnIndex
                    (MyDbHelper.COL_NAME)));
            first_row++;
            if(first_row >= mCursor.getCount()) 
                first_row = 0;
        }
        
        first_row -= total_row;
        
        while(first_row < 0) {
            first_row += mCursor.getCount();
        }
        
        last_row = first_row + total_row - 1;

        while(last_row >= mCursor.getCount()) {
            last_row -= mCursor.getCount();
        }

        lv = (ListView)findViewById(R.id.listView1);
        lv.setAdapter(new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, arr_list));
        lv.setSelection((total_row / 2));
        lv.setOnScrollListener(new OnScrollListener() {
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if(firstVisibleItem + visibleItemCount >= totalItemCount) {
                    arr_list = new ArrayList<String>();
                    last_row -= total_row / 2;

                    while(last_row < 0) {
                        last_row += mCursor.getCount();
                    }
                    
                    for(int i = 0 ; i < total_row ; i++) {
                        mCursor.moveToPosition(last_row);
                        arr_list.add(mCursor.getString
                                (mCursor.getColumnIndex
                                (MyDbHelper.COL_NAME)));
                        last_row++;
                        if(last_row >= mCursor.getCount()) 
                            last_row = 0;
                    }
                    
                    first_row = last_row - total_row;
                    
                    while(first_row < 0) {
                        first_row += mCursor.getCount();
                    }
                    
                    last_row--;
                    while(last_row < 0) {
                        last_row += mCursor.getCount();
                    }

                    lv.setAdapter(new ArrayAdapter<String>
                            (getApplicationContext(),
                            android.R.layout.simple_list_item_1
                            , arr_list));
                    
                    if(total_row % 2 == 0) {
                        lv.setSelection
                            ((firstVisibleItem + 2) - (total_row / 2) );
                    } else {
                        lv.setSelection
                            ((firstVisibleItem + 1) - (total_row / 2) );
                    }
                }
                
                if(firstVisibleItem == 0) {
                    arr_list = new ArrayList<String>();
                    first_row -= total_row / 2;

                    while(first_row < 0) {
                        first_row += mCursor.getCount();
                    }
                    
                    for(int i = 0 ; i < total_row ; i++) {
                        mCursor.moveToPosition(first_row);
                        arr_list.add(mCursor.getString
                                (mCursor.getColumnIndex
                                (MyDbHelper.COL_NAME)));
                        first_row++;
                        if(first_row >= mCursor.getCount()) 
                            first_row = 0;
                    }
                    
                    first_row -= total_row;
                    
                    while(first_row < 0) {
                        first_row += mCursor.getCount();
                    }
                    
                    last_row = first_row + total_row - 1;

                    while(last_row >= mCursor.getCount()) {
                        last_row -= mCursor.getCount();
                    }

                    lv.setAdapter(new ArrayAdapter<String>
                            (getApplicationContext(),
                            android.R.layout.simple_list_item_1
                            , arr_list));
                    lv.setSelection((total_row / 2) + 1);
                }
            }

            public void onScrollStateChanged(AbsListView view
                    , int scrollState) { }
        });
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}


Database.java
package app.akexorcist.listviewendlessloopdatabase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

class MyDbHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "BTS";
    private static final int DB_VERSION = 1;
    
    public static final String TABLE_NAME = "Product";

    public static final String COL_NAME = "name";
    
    public MyDbHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE "+ TABLE_NAME 
                + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " 
                + COL_NAME + " TEXT);");
        for(int i = 0 ; i < 2000 ; i++) {
            db.execSQL("INSERT INTO "+ TABLE_NAME 
                    + " (" + COL_NAME + ") VALUES ('Row" 
                    + String.valueOf(i) + "');"); 
        }
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion
            , int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);
        onCreate(db);
    }
}

public class Database { }

main.xml
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical"  
    android:background="#666666" >  
    <ListView  
        android:id="@+id/listView1"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:layout_margin="30dp"  
        android:cacheColorHint="#00000000" />  
</LinearLayout>  

AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.akexorcist.listviewendlessloopdatabase"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".Main"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


สำหรับผู้ที่หลงเข้ามาอ่านผู้ใดที่ต้องการดาวน์โหลดไฟล์ตัวอย่าง
สามารถดาวน์โหลดได้จากที่นี่เลย List View Endless Loop Database [Google Drive]




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium