回転:CursorAdapter
7285 ワード
BaseAdapterに継承され、cursorとListViewに接続されたブリッジを提供する虚クラスです.
直接サブクラスは、ResourceCursorAdapterClass Overview.Adapter that exposes data from a Cursor to a ListView widget.The Cursor must include a column named "_id"or this class will not work.注意cursorには「_id」という名前の列が必要です.例えばContacts.IDが「_id」である場合、以下の関数を実装する必要があります.
注意:newViewこの関数は、最初のコールバック後、データが増加すると呼び出されますが、再描画は呼び出されません.データが増加すると,コールバックはこの関数を用いて新規データに対応するviewを生成する.bindView関数の最初のコールバック後、データの更新も呼び出されますが、再描画は再び呼び出されます.【総じてbindViewを呼び出してviewが空であることを発見した場合、newViewを呼び出してviewを生成するはずです】
附1:newViewとbindViewのテスト結果について
一般書にはCursorAdapterの使い方も紹介されていません.自分のCursorAdapterをカスタマイズし、newView、bindView、changeCursorを上書きします.ListViewを例に挙げると、listViewは毎回newViewを呼び出すわけではないので、itemごとのviewオブジェクトは一度だけインスタンス化されます.itemを描画するたびにbindViewが呼び出されます.これはダイナミックバインドです.レコードが変更された場合、ListViewでリアルタイムで更新されます.データの遅延ロードを実行する場合は、bindViewでロードしてからバックグラウンドスレッドロードを開始できます.データベースを使用しないアプリケーションでは、MatrixCursorを使用してcursorオブジェクトを生成することもできます.
ここを見てください.http://stackoverflow.com/questions/3535074/getview-vs-bindview-in-a-custom-cursoradapterあるいはandroidのCustomAdapterのソースコードを見に行きます.CustomAdapterはBaseAdapterのgetViewメソッドを上書きし、newView()とbindView()を呼び出します.だからあなたはこの3つの方法の呼び出し関係を知っているでしょう.adapterのメカニズムはlistのメカニズムと関係がありますが、実際のデータ項目がいくらあっても、画面に表示されるのは固定個数のitemだけです(listの高さや幅によって異なります).リストスライド時に、Itemが画面から飛び出したかどうかを判断し、スライドしたitemが解放され、新しいitemが加わって表示されます.新しいitemを追加するたびにgetView()メソッドが呼び出されます.logを打つと、スライド距離がitemアイテムの高さを超えるとgetView()が呼び出されるのがわかります.
ここを見てください.
http://stackoverflow.com/questions/3535074/getview-vs-bindview-in-a-custom-cursoradapter
あるいはandroidのCustomAdapterのソースコードを見に行きます.
CustomAdapterはBaseAdapterのgetViewメソッドを上書きし、newView()とbindView()を呼び出します.だからあなたはこの3つの方法の呼び出し関係を知っているでしょう.
adapterのメカニズムはlistのメカニズムと関係がありますが、実際のデータ項目がいくらあっても、画面に表示されるのは固定個数のitemだけです(listの高さや幅によって異なります).
リストスライド時に、Itemが画面から飛び出したかどうかを判断し、スライドしたitemが解放され、新しいitemが加わって表示されます.新しいitemを追加するたびにgetView()メソッドが呼び出されます.
logを打つと、スライド距離がitemアイテムの高さを超えるとgetView()が呼び出されるのがわかります.
public abstract class CursorAdapter extends BaseAdapter
直接サブクラスは、ResourceCursorAdapterClass Overview.Adapter that exposes data from a Cursor to a ListView widget.The Cursor must include a column named "_id"or this class will not work.注意cursorには「_id」という名前の列が必要です.例えばContacts.IDが「_id」である場合、以下の関数を実装する必要があります.
abstract View newView(Context context, Cursor cursor, ViewGroup parent)
//Makes a new view to hold the data pointed to by cursor.
abstract void bindView(View view, Context context, Cursor cursor)
//Bind an existing view to the data pointed to by cursor
注意:newViewこの関数は、最初のコールバック後、データが増加すると呼び出されますが、再描画は呼び出されません.データが増加すると,コールバックはこの関数を用いて新規データに対応するviewを生成する.bindView関数の最初のコールバック後、データの更新も呼び出されますが、再描画は再び呼び出されます.【総じてbindViewを呼び出してviewが空であることを発見した場合、newViewを呼び出してviewを生成するはずです】
import java.util.List;
import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.Handler;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CursorAdapter;
import android.widget.TextView;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.RawContacts;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HelloCursor extends ListActivity {
private static String[] PROJECTION = new String[] { Contacts._ID,
Contacts.DISPLAY_NAME };
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Cursor c = getContentResolver().query(Contacts.CONTENT_URI, PROJECTION,
null, null, Contacts.DISPLAY_NAME + " COLLATE NOCASE");
startManagingCursor(c);
MyCursorAdapter adapter = new MyCursorAdapter(this, R.layout.list_row,
c);
this.setListAdapter(adapter);
Button button = (Button)findViewById(R.id.Button01);
OnClickListener listener=new OnClickListener(){
@Override
public void onClick(View v) {
doAction();
}
};
button.setOnClickListener(listener);
mHandler = new Handler();
}
private String[] mStrings = { "hubin", "hudashi", "robin" };
int cnt = 0;
private Handler mHandler;
class AddContactThread implements Runnable {
public void run() {
int nStringLength = mStrings.length;
int randomNumber = 0;
ContentValues newValues = new ContentValues();
String tempString = null;
randomNumber = (int) (Math.random() % 10);
for (int i = 0; i < nStringLength; i++) {
tempString = mStrings + cnt + randomNumber;
newValues.put(Contacts.DISPLAY_NAME, tempString);
getContentResolver().insert(RawContacts.CONTENT_URI, newValues);
newValues.clear();
}
cnt++;
}
}
AddContactThread addContact=new AddContactThread();
void doAction()
{
mHandler.post(addContact);
}
}
class MyCursorAdapter extends CursorAdapter {
Context context=null;
int viewResId;
public MyCursorAdapter(Context context, int resource, Cursor cursor) {
super(context,cursor);
viewResId=resource;
}
public View newView(Context context, Cursor cursor, ViewGroup parent) {
TextView view =null;
LayoutInflater vi = null;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view =(TextView)vi.inflate(viewResId, parent, false);
//v =(TextView)vi.inflate(textViewResourceId,null);
Log.i("hubin","newView"+view);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
Log.i("hubin","bind"+view);
TextView nameView = (TextView) view;
// Set the name
nameView.setText(cursor
.getString(cursor.getColumnIndex("DISPLAY_NAME")));
}
}
附1:newViewとbindViewのテスト結果について
newView android.widget.TextView@43b98ea0
bind android.widget.TextView@43b98ea0
newView android.widget.TextView@43b99948
bind android.widget.TextView@43b99948
newView android.widget.TextView@43b9a3f0
bind android.widget.TextView@43b9a3f0
add
bind android.widget.TextView@43b9a3f0
bind android.widget.TextView@43b99948
bind android.widget.TextView@43b98ea0
newView android.widget.TextView@43b9c5b0
bind android.widget.TextView@43b9c5b0
newView android.widget.TextView@43b9d058
bind android.widget.TextView@43b9d058
newView android.widget.TextView@43b9db00
bind android.widget.TextView@43b9db00
一般書にはCursorAdapterの使い方も紹介されていません.自分のCursorAdapterをカスタマイズし、newView、bindView、changeCursorを上書きします.ListViewを例に挙げると、listViewは毎回newViewを呼び出すわけではないので、itemごとのviewオブジェクトは一度だけインスタンス化されます.itemを描画するたびにbindViewが呼び出されます.これはダイナミックバインドです.レコードが変更された場合、ListViewでリアルタイムで更新されます.データの遅延ロードを実行する場合は、bindViewでロードしてからバックグラウンドスレッドロードを開始できます.データベースを使用しないアプリケーションでは、MatrixCursorを使用してcursorオブジェクトを生成することもできます.
ここを見てください.http://stackoverflow.com/questions/3535074/getview-vs-bindview-in-a-custom-cursoradapterあるいはandroidのCustomAdapterのソースコードを見に行きます.CustomAdapterはBaseAdapterのgetViewメソッドを上書きし、newView()とbindView()を呼び出します.だからあなたはこの3つの方法の呼び出し関係を知っているでしょう.adapterのメカニズムはlistのメカニズムと関係がありますが、実際のデータ項目がいくらあっても、画面に表示されるのは固定個数のitemだけです(listの高さや幅によって異なります).リストスライド時に、Itemが画面から飛び出したかどうかを判断し、スライドしたitemが解放され、新しいitemが加わって表示されます.新しいitemを追加するたびにgetView()メソッドが呼び出されます.logを打つと、スライド距離がitemアイテムの高さを超えるとgetView()が呼び出されるのがわかります.
ここを見てください.
http://stackoverflow.com/questions/3535074/getview-vs-bindview-in-a-custom-cursoradapter
あるいはandroidのCustomAdapterのソースコードを見に行きます.
CustomAdapterはBaseAdapterのgetViewメソッドを上書きし、newView()とbindView()を呼び出します.だからあなたはこの3つの方法の呼び出し関係を知っているでしょう.
adapterのメカニズムはlistのメカニズムと関係がありますが、実際のデータ項目がいくらあっても、画面に表示されるのは固定個数のitemだけです(listの高さや幅によって異なります).
リストスライド時に、Itemが画面から飛び出したかどうかを判断し、スライドしたitemが解放され、新しいitemが加わって表示されます.新しいitemを追加するたびにgetView()メソッドが呼び出されます.
logを打つと、スライド距離がitemアイテムの高さを超えるとgetView()が呼び出されるのがわかります.