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クリックイベントを処理するプライベート内部クラスが定義されています.次のソースコードを参照してください.
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はこのように実現され、それに似たリスナーも同様である.モニターは実際の開発でよく使われているので、細かいことを理解する必要があります.