Android独学ノート:onXXXイベントリスナーの2つのパラメータpositionとidを分析する
Android APIの一部のイベントリスナーの方法には、1つのビューのいずれか(item、もちろん他の意味にも理解できる)を記述するための属性であるパラメータpositionとidがあります.positionは、ビュー内のアイテムの位置を記述する.idは、そのアイテムのidを記述し、正確には、そのアイテムがビュー内に存在する行の位置である.
これは困惑をもたらして、私たちは実際の開発の中で、いったいどのようにこの2つのパラメータを理解しますか?どうやって使うの?両者の違いは何ですか.
次に、ListViewのonItemClickListenerイベントリスナーを例に、両者の違いと使い方を分析します.
一、区別
少し複雑なようで、2つのシーンに分けて議論します.
1.ListViewがSimpleAdapterでデータを表示する
position:ビュー内のアイテムの位置を表し、最初は0です.
id:同上.
2.ListViewはCursorAdapterでデータを表示する
position:同上.
id:この項目がビュー内の実際の位置を表し、はっきり言えば開始が1である.ビューでは数行目、数行目です.例:あるListViewには5行のデータがあり、3行目を選択するとonItemClickListener()のidは3になります.
3.ソース分析
以上、2つのシーンの意味を簡単にまとめました.いくら多くてもソースコードからの分析には及ばないと言っています.
2つのシーンに分けて、まずCursorAdapterシーンを分析します.
パラメータpositionとidに与えられた値は誰ですか?
android.widget.AbsListViewには、ListViewクリックイベントを処理するプライベート内部クラスが定義されています.次のソースコードを参照してください.
CursorAdapterシーンのidはどのように実現されますか?
android.database.CursorWindowはgetLong()を定義し、実装しています.次のソースコードを参照してください.
SimpleAdapterシーンのidはどのように実現されますか?
CursorAdapterシーンのidインプリメンテーションを理解すると、SimpleAdapterのインプリメンテーションはより簡単に理解できます.非常に簡単です.次のソースコードを参照してください.
二、使用方法
2つのシーンに分けて、使用方法をコード形式で表示します.以下は2行目を選択します.
1.SimpleAdapter
2. CursorAdapter
四、まとめ
現在はpositonを重点的に使用することを上策とし、より複合プログラマーのプログラミング習慣(以下0から始まる)を強化しなければならない.idには一定の変数があり、実際の用途が理解されていないのかもしれないし、なぜidがlongタイプなのかよく理解されていない.
onItemClickListener()のpositionとidはこのように実現され、それに似たリスナーも同様である.モニターは実際の開発でよく使われているので、細かいことを理解する必要があります.
これは困惑をもたらして、私たちは実際の開発の中で、いったいどのようにこの2つのパラメータを理解しますか?どうやって使うの?両者の違いは何ですか.
次に、ListViewのonItemClickListenerイベントリスナーを例に、両者の違いと使い方を分析します.
一、区別
少し複雑なようで、2つのシーンに分けて議論します.
1.ListViewがSimpleAdapterでデータを表示する
position:ビュー内のアイテムの位置を表し、最初は0です.
id:同上.
2.ListViewはCursorAdapterでデータを表示する
position:同上.
id:この項目がビュー内の実際の位置を表し、はっきり言えば開始が1である.ビューでは数行目、数行目です.例:あるListViewには5行のデータがあり、3行目を選択するとonItemClickListener()のidは3になります.
3.ソース分析
以上、2つのシーンの意味を簡単にまとめました.いくら多くてもソースコードからの分析には及ばないと言っています.
2つのシーンに分けて、まずCursorAdapterシーンを分析します.
パラメータpositionとidに与えられた値は誰ですか?
android.widget.AbsListViewには、ListViewクリックイベントを処理するプライベート内部クラスが定義されています.次のソースコードを参照してください.
private class PerformClick extends WindowRunnnable implements Runnable {
View mChild;//
int mClickMotionPosition;// ( 。)
//
public void run() {
if (mDataChanged) return;
// Android 。
//SimpleAdapter CursorAdapter?
// 。
final ListAdapter adapter = mAdapter;
// position。
final int motionPosition = mClickMotionPosition;
if (adapter != null && mItemCount > 0 &&
motionPosition != INVALID_POSITION &&
motionPosition < adapter.getCount() && sameWindow()) {
//positon position, id , position 。
//adapter getItemId(motionPosition) 。
performItemClick(mChild, motionPosition, adapter.getItemId(motionPosition));
}
}
}
CursorAdapterシーンのidはどのように実現されますか?
public long getItemId(int position) {
if (mDataValid && mCursor != null) {
// position 。
if (mCursor.moveToPosition(position)) {
// mRowIDColumn ID , ”_id” 。
return mCursor.getLong(mRowIDColumn);
} else {
return 0;
}
} else {
return 0;
}
}
android.database.CursorWindowはgetLong()を定義し、実装しています.次のソースコードを参照してください.
public long getLong(int row, int col) {
acquireReference();
try {
// getLong_native ,
// col mRowIDColumn。
return getLong_native(row - mStartPos, col);
} finally {
releaseReference();
}
}
SimpleAdapterシーンのidはどのように実現されますか?
CursorAdapterシーンのidインプリメンテーションを理解すると、SimpleAdapterのインプリメンテーションはより簡単に理解できます.非常に簡単です.次のソースコードを参照してください.
public long getItemId(int position) {
// position
return position;
}
二、使用方法
2つのシーンに分けて、使用方法をコード形式で表示します.以下は2行目を選択します.
1.SimpleAdapter
// , _id , ”_id”,Android 。 , 。
ArrayList<HashMap<String, String>> classic = new ArrayList<HashMap<String, String>>();
HashMap<String, String> englishMap = new HashMap<String, String>();
englishMap.put(“classic_id”,1l);
englishMap.put(“name”,lileilei);
englishMap.put(“gender”,male);
englishMap.put(“classic _id”,2l);
englishMap.put(“name”,hanmeimei);
englishMap.put(“gender”,female);
englishMap.put(“classic _id”,3l);
englishMap.put(“name”,poly);
englishMap.put(“gender”,male);
// SimpleAdater
SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, R.layout.classic,new String[] { " classic _id", "name", "age" }, new int[] {R.id.id_text, R.id.name_text, R.id.age_text });
//
ListView lv = this.findViewById(R.id.listview);
lv.setAdapter(simpleAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i(LOG_TAG, "position:" + position);// 1
Log.i(LOG_TAG, "id:" + id);// 1
Log.i(LOG_TAG, "item class : "+ ((ListView) parent).getItemAtPosition(position).getClass().getSimpleName());// item class : HashMap
// HashMap, HashMap 。
HashMap<String, String> englishMap = (HashMap<String, String>) ((ListView) parent).getItemAtPosition(position);
if (englishMap!= null && englishMap.size()> 0) {
//
}
}
});
2. CursorAdapter
// , , Cursor ”_id” 。
Cursor cursor = .....;// Cursor ;
// SimpleCursorAdapter
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this,R.layout.person, cursor, new String[] { " classic _id ", "name", "age" },new int[] { R.id.id_text, R.id.name_text, R.id.age_text });
//
ListView lv = this.findViewById(R.id.listview);
lv.setAdapter(simpleCursorAdapter);
lv.setOnItemClickListener(newOnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Log.i(LOG_TAG, "position:" + position);// 1
Log.i(LOG_TAG, "id:" + id);// 2
Log.i(LOG_TAG, "item class : "+ ((ListView) parent).getItemAtPosition(position).getClass().getSimpleName());// item class : SQLiteCursor
// SQLiteCursor, Cursor 。
Cursor cursor = (Cursor) ((ListView) parent).getItemAtPosition(position);
if (cursor != null && cursor.moveToPosition(position)) {
//
}
}
});
四、まとめ
現在はpositonを重点的に使用することを上策とし、より複合プログラマーのプログラミング習慣(以下0から始まる)を強化しなければならない.idには一定の変数があり、実際の用途が理解されていないのかもしれないし、なぜidがlongタイプなのかよく理解されていない.
onItemClickListener()のpositionとidはこのように実現され、それに似たリスナーも同様である.モニターは実際の開発でよく使われているので、細かいことを理解する必要があります.