|
|
|
[Android] อยากทราบเกี่ยวกับการโหลด ListView ออกจากฐานข้อมูล กรณีข้อมูลมากๆ |
|
|
|
|
|
|
|
ปกติ ListView มันก็แสดงข้อมูล เฉพาะที่ปรากฏน่ะครับ ลองใช้ convertView มาจัดการครับ ช่วยได้เยอะครับ
Code (Java)
package com.myapp;
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
ArrayList<HashMap<String, String>> MyArrList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// listView1
final ListView lisView1 = (ListView)findViewById(R.id.listView1);
MyArrList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map;
/*** Rows 1 ***/
map = new HashMap<String, String>();
map.put("ID", "1");
map.put("Code", "TH");
map.put("Country", "Thailand");
MyArrList.add(map);
/*** Rows 2 ***/
map = new HashMap<String, String>();
map.put("ID", "2");
map.put("Code", "VN");
map.put("Country", "Vietnam");
MyArrList.add(map);
/*** Rows 3 ***/
map = new HashMap<String, String>();
map.put("ID", "3");
map.put("Code", "ID");
map.put("Country", "Indonesia");
MyArrList.add(map);
/*** Rows 4 ***/
map = new HashMap<String, String>();
map.put("ID", "4");
map.put("Code", "LA");
map.put("Country", "Laos");
MyArrList.add(map);
/*** Rows 5 ***/
map = new HashMap<String, String>();
map.put("ID", "5");
map.put("Code", "MY");
map.put("Country", "Malaysia");
MyArrList.add(map);
lisView1.setAdapter(new CountryAdapter(this));
}
public class CountryAdapter extends BaseAdapter
{
private Context context;
public CountryAdapter(Context c)
{
// TODO Auto-generated method stub
context = c;
}
public int getCount() {
// TODO Auto-generated method stub
return MyArrList.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
CountryHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activity_column, null);
holder = new CountryHolder();
holder.ID = (TextView) convertView.findViewById(R.id.ColID);
holder.Code = (TextView) convertView.findViewById(R.id.ColCode);
holder.Country = (TextView) convertView.findViewById(R.id.ColCountry);
convertView.setTag(holder);
} else {
holder = (CountryHolder) convertView.getTag();
}
holder.ID.setText(MyArrList.get(position).get("ID"));
holder.Code.setText(MyArrList.get(position).get("Code"));
holder.Country.setText(MyArrList.get(position).get("Country"));
return convertView;
}
}
public class CountryHolder {
TextView ID;
TextView Code;
TextView Country;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
สังเกตุดูในส่วนของ getView() ครับ
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
CountryHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activity_column, null);
holder = new CountryHolder();
holder.ID = (TextView) convertView.findViewById(R.id.ColID);
holder.Code = (TextView) convertView.findViewById(R.id.ColCode);
holder.Country = (TextView) convertView.findViewById(R.id.ColCountry);
convertView.setTag(holder);
} else {
holder = (CountryHolder) convertView.getTag();
}
holder.ID.setText(MyArrList.get(position).get("ID"));
holder.Code.setText(MyArrList.get(position).get("Code"));
holder.Country.setText(MyArrList.get(position).get("Country"));
return convertView;
}
}
public class CountryHolder {
TextView ID;
TextView Code;
TextView Country;
}
มีการ Re-Use ตัว Layout ครับ
|
|
|
|
|
Date :
2012-09-03 18:18:46 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถามหน่อยครับ ผมต้องแก้ยังไงตรงไหนครับ
codeผมเป็นแบบนี้
Code(myDBClass)
package com.test;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class myDBClass extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "lexitron";
// Table Name
private static final String TABLE_MEMBER = "eng2th";
public myDBClass(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// Create Table Name
db.execSQL("CREATE TABLE " + TABLE_MEMBER +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
" esearch TEXT," +
" eentry TEXT," +
" tentry TEXT," +
" ecat TEXT," +
" ethai TEXT," +
" esyn TEXT," +
" eant TEXT);");
Log.d("CREATE TABLE","Create Table Successfully.");
}
// Select Data
public String[] SelectData(String strID) {
// TODO Auto-generated method stub
try {
String arrData[] = null;
SQLiteDatabase db;
db = this.getReadableDatabase(); // Read Data
Cursor cursor = db.query(TABLE_MEMBER, new String[] { "*" },
"_id=?",
new String[] { String.valueOf(strID) }, null, null, null, null);
if(cursor != null)
{
if (cursor.moveToFirst()) {
arrData = new String[cursor.getColumnCount()];
arrData[1] = cursor.getString(1);
arrData[2] = cursor.getString(2);
arrData[3] = cursor.getString(3);
arrData[4] = cursor.getString(4);
arrData[6] = cursor.getString(6);
arrData[7] = cursor.getString(7);
}
}
cursor.close();
db.close();
return arrData;
} catch (Exception e) {
return null;
}
}
// Show All Data
public ArrayList<HashMap<String, String>> SelectAllData() {
// TODO Auto-generated method stub
try {
ArrayList<HashMap<String, String>> MyArrList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map;
SQLiteDatabase db;
db = this.getReadableDatabase(); // Read Data
String strSQL = "SELECT * FROM " + TABLE_MEMBER;
Cursor cursor = db.rawQuery(strSQL, null);
int i,j;
if(cursor != null)
{
for(i=1; i<=10; i++){
if (cursor.moveToNext())
{
//do{
map = new HashMap<String, String>();
map.put("_id", cursor.getString(0));
map.put("esearch", cursor.getString(1));
map.put("ecat", "["+cursor.getString(4)+"]");
MyArrList.add(map);
//} while(cursor.moveToNext());
}
}
}
cursor.close();
db.close();
return MyArrList;
} catch (Exception e) {
Log.e("Exception", e.toString());
return null;
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + TABLE_MEMBER);
// Re Create on method onCreate
onCreate(db);
}
}
Code(ShowActivity)
package com.test;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class ShowActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
final myDBClass myDb = new myDBClass(this);
final ArrayList<HashMap<String, String>> MebmerList = myDb.SelectAllData();
// listView1
ListView lisView1 = (ListView)findViewById(R.id.listView1);
SimpleAdapter sAdap;
sAdap = new SimpleAdapter(ShowActivity.this, MebmerList, R.layout.activity_column,
new String[] {"esearch","ecat"}, new int[] {R.id.ColEsearch,R.id.ColEcat});
lisView1.setAdapter(sAdap);
lisView1.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> myAdapter, View myView, int position, long mylng) {
// Show on new activity
Intent newActivity = new Intent(ShowActivity.this,DetailActivity.class);
newActivity.putExtra("ID", MebmerList.get(position).get("_id").toString());
startActivity(newActivity);
}
});
// btnCancel (Cancel)
final Button cancel = (Button) findViewById(R.id.btnCancel);
cancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Open Form Main
Intent newActivity = new Intent(ShowActivity.this,MainActivity.class);
startActivity(newActivity);
}
});
}
}
ช่วยดูให้หน่อยนะครับ
|
|
|
|
|
Date :
2012-09-06 10:56:10 |
By :
kitnu |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ต้องแก้ไขก็ได้ครับ เพราะปกติแล้ว มันจะแสดงผลเฉพาะส่วนที่เป็นหน้าขนาดจอปัจจุบันเท่านั้นครับ แต่ถ้าคุณอยากจะเปลี่ยนก็เปลี่ยนอย่างที่ผมแนะนำครับ พวก Custom Lauout ListView ในบทความ Android ผมเขียนไว้หลายตัวครับ
|
|
|
|
|
Date :
2012-09-06 16:40:00 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มัน out of memmory อะครับ
|
|
|
|
|
Date :
2012-09-06 17:14:34 |
By :
kitnu |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อย่างนั้นคุณน่าจะต้องจัดการตั้งแต่ขั้นตอนการดึงข้อมูลมาครับ คือเลือกเฉพาะให้พอดีกับขนาดหน้าจอ
ดูตัวอย่างนี้ครับ
Go to : Android ListView Padding and Pagination
ตัวอย่างนี้มันจะแสดงเฉพาะใน ListView ครับ หรือเท่า ๆ กับจำนวน Item ที่กำหนดครับ
|
|
|
|
|
Date :
2012-09-06 17:36:34 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แล้ววิธี convertView ที่พี่บอกมา ช่วยได้ไหมครับ
|
|
|
|
|
Date :
2012-09-08 13:01:34 |
By :
kitnu |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองดูครับ ในระดับการใช้งานจริง ๆ ผมยังไม่เคยลองเลยครับ เคยแต่ผ่าน Emulator ครับ ว่าแต่ข้อมูลคุณมีกี่ Record ครับ ถึง Memory เต็ม
|
|
|
|
|
Date :
2012-09-08 13:28:33 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แปดหมื่นอะครับเป็นดิชชั่นนารี อะครับ
|
|
|
|
|
Date :
2012-09-08 14:22:22 |
By :
kitnu |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โอ๊ว แบบนั้นเยอะมากครับ มันเต็มตั้งแต่การเก็บลง Cursor หรือ Array แล้วครับ คุณ Query มาเฉพาะ Record ที่ต้องการครับ
|
|
|
|
|
Date :
2012-09-08 15:03:27 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 00
|