日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ListView position

發(fā)布時(shí)間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ListView position 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  在使用listview的時(shí)候,我們經(jīng)常會(huì)在listview的監(jiān)聽事件中,例如OnItemClickListener(onItemClick)中,或listview的adapter中(getView、getItem、getItemId等)看到position這個(gè)變量。在我們沒有為listview添加headerView時(shí),position和數(shù)據(jù)源集合的索引是一致的,當(dāng)添加了headerView之后,某些地方的position值就會(huì)發(fā)生變化,如果不理解清楚,經(jīng)常會(huì)犯一些糊涂。

  在listview添加了headerView后, 會(huì)將所有view交給HeaderViewListAdapter來處理,所以我們要在setAdapter之前添加headerView或footerView,否則將顯示不出來。

@Overridepublic void setAdapter(ListAdapter adapter) {if (mAdapter != null && mDataSetObserver != null) {mAdapter.unregisterDataSetObserver(mDataSetObserver);}resetList();mRecycler.clear();if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);} else {mAdapter = adapter;}

  先看看HeaderListAdapter中幾個(gè)帶position參數(shù)的方法實(shí)現(xiàn),我們可以看到在傳出的position為adjPosition,而adjPosition均為我們自動(dòng)去掉了headerView的數(shù)量,所以adapter中幾個(gè)帶position變量的方法,得到的position值均和數(shù)據(jù)源集合索引一致,仔細(xì)翻看HeaderListAdapter中所有需要傳出position的方法,position的值都是自動(dòng)減去了headerView數(shù)量。

public View getView(int position, View convertView, ViewGroup parent) {// Header (negative positions will throw an ArrayIndexOutOfBoundsException)int numHeaders = getHeadersCount();if (position < numHeaders) {return mHeaderViewInfos.get(position).view;}// Adapterfinal int adjPosition = position - numHeaders;int adapterCount = 0;if (mAdapter != null) {adapterCount = mAdapter.getCount();if (adjPosition < adapterCount) {return mAdapter.getView(adjPosition, convertView, parent);}}// Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException)return mFooterViewInfos.get(adjPosition - adapterCount).view;} public Object getItem(int position) {// Header (negative positions will throw an ArrayIndexOutOfBoundsException)int numHeaders = getHeadersCount();if (position < numHeaders) {return mHeaderViewInfos.get(position).data;}// Adapterfinal int adjPosition = position - numHeaders;int adapterCount = 0;if (mAdapter != null) {adapterCount = mAdapter.getCount();if (adjPosition < adapterCount) {return mAdapter.getItem(adjPosition);}}// Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException)return mFooterViewInfos.get(adjPosition - adapterCount).data;}public long getItemId(int position) {int numHeaders = getHeadersCount();if (mAdapter != null && position >= numHeaders) {int adjPosition = position - numHeaders;int adapterCount = mAdapter.getCount();if (adjPosition < adapterCount) {return mAdapter.getItemId(adjPosition);}}return -1;}

  

  我們再來分析分析OnItemClickListener的相關(guān)源碼,OnItemClickListener在android.widget.AdapterView的public boolean performItemClick(View view, int position, long id)函數(shù)中被調(diào)用。而performItemClick是在android.widget.AbsListView.PerformClick.run() 中被調(diào)用:

private class PerformClick extends WindowRunnnable implements Runnable {int mClickMotionPosition;public void run() {// The data has changed since we posted this action in the event queue,// bail out before bad things happenif (mDataChanged) return;final ListAdapter adapter = mAdapter;final int motionPosition = mClickMotionPosition;if (adapter != null && mItemCount > 0 &&motionPosition != INVALID_POSITION &&motionPosition < adapter.getCount() && sameWindow()) {final View view = getChildAt(motionPosition - mFirstPosition);// If there is no view, something bad happened (the view scrolled off the// screen, etc.) and we should cancel the clickif (view != null) {performItemClick(view, motionPosition, adapter.getItemId(motionPosition));}}}}

  從源碼中,我們可以看到position對應(yīng)motionPosition,而motionPosition通過調(diào)試,我們發(fā)現(xiàn)就是listview中被點(diǎn)擊的位置,所以我們經(jīng)常在onItemClick中需要獲取數(shù)據(jù)源集合中某個(gè)item時(shí),會(huì)習(xí)慣性寫這樣代碼:sourceList.get(position-listView.getHeaderViewsCount())。

  我們發(fā)現(xiàn)onItemClick還有一個(gè)參數(shù),其實(shí)就是上面源碼中傳遞給performItemClick的第三個(gè)參數(shù),而第三個(gè)參數(shù)是通過調(diào)用adapter的getItemId將motionPosition減去了headerView的數(shù)量,所以這個(gè)參數(shù)的結(jié)果是與數(shù)據(jù)源集合的索引一致的。也就是說,我們完全可以使用onItemClick的id這個(gè)參數(shù),這個(gè)參數(shù)是和數(shù)據(jù)源集合的索引一致的。

  另外我們需要注意,如果數(shù)據(jù)源沒有內(nèi)容,則id的值會(huì)為-1,所以我們在使用id時(shí),需要對id做適當(dāng)判斷。

  總結(jié):在OnItemClickListener的onItemClick方法中,當(dāng)我們需要獲取點(diǎn)擊listview對應(yīng)的數(shù)據(jù)源索引時(shí),使用id參數(shù)即可。另外除了onItemClick的position參數(shù)是點(diǎn)擊listview對應(yīng)view的位置外,adapter中所有position均為數(shù)據(jù)源索引位置。其實(shí)換個(gè)角度更容易記,在listview中,position理應(yīng)是listview中view對應(yīng)的位置,而在adapter中,理應(yīng)是數(shù)據(jù)源的索引位置。

轉(zhuǎn)載于:https://www.cnblogs.com/endure/p/5872409.html

總結(jié)

以上是生活随笔為你收集整理的ListView position的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品人妻少妇嫩草av无码 | 亚洲欧美视频在线播放 | 一区二区精品在线观看 | 国产精品午夜未成人免费观看 | 欧美精品 在线观看 | 91一区二区三区在线观看 | 桃花久久| 日本αv | 欧美成人免费播放 | japansexxxxhd医生 夜夜操导航 | 麻豆69| 自拍啪啪| 小日子的在线观看免费第8集 | 色屁屁ts人妖系列二区 | 成人综合一区二区 | 99热免费在线 | 少妇高潮大叫好爽喷水 | 成年人免费网站在线观看 | 中文字幕 自拍偷拍 | 亚洲一区二区视频在线观看 | 兄弟兄弟全集免费观看 | 精品国产乱码久久久久久蜜臀 | 欧美自拍偷拍 | 欧美91成人网 | 日韩av一卡二卡 | 国产3级| 精品国产人妻一区二区三区 | 欧美一级黑人 | 91视频最新| 香蕉视频97 | 国产福利一区在线观看 | 操操干| 中国一及毛片 | 欧美无人区码suv | 吊视频一区二区三区 | 欧美成一区二区三区 | 亚洲精品一级片 | 亚洲日本一区二区 | 一区二区啪啪啪 | 一区二区三区国产av | 拔插拔插海外华人永久免费 | 一级免费视频 | 另类综合小说 | 久草影视在线观看 | 情侣黄网站免费看 | 欧美人体一区二区三区 | 91爱啪啪| 大香蕉视频一区二区 | 亚洲jizzjizz日本少妇 | 五月天一区二区三区 | 99色| 欧美三级欧美成人高清 | 久久久精品在线 | 超碰极品 | 亚洲第一av| 蜜桃av噜噜一区二区三区 | 国产精品丝袜在线观看 | 黄色亚洲视频 | 国产女人毛片 | 伊人色爱 | 国产探花一区二区 | 国产精品二区一区二区aⅴ污介绍 | 国产精品久久久久久久久免费相片 | 99热这里只有精品4 精品国产黄色 | 亚洲人成无码www久久久 | 啪啪免费av| 白洁av| 欧美日韩一级二级三级 | 国产看真人毛片爱做a片 | 91精品国产高潮对白 | av观看网| 动漫美女靠逼 | 国产精品久久久久久亚洲毛片 | 中文字幕视频二区 | 亚洲系列中文字幕 | 我们的2018在线观看免费高清 | 国产网址 | 成人在线免费播放视频 | 女人张开腿让男人插 | 国产sm调教一区二区 | 69xx网站| 超碰在线天天 | 亚洲黄色一级 | 国产一区二区内射 | 婷婷在线免费视频 | 国产一线天粉嫩馒头极品av | 在线播放日韩av | 快播色图 | 性国产精品 | 欧美r级在线| 欧美日韩一区在线播放 | 亚洲色图10p | 中文在线字幕免费观 | 国产明星换脸xxxx色视频 | 无码av免费精品一区二区三区 | 亚洲国产亚洲 | 欧美一区二区三区在线看 | 亚洲日本免费 | 久久99精品久久久久久噜噜 |