日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一区二区三区免费视频 | 另类视频在线观看+1080p | 国产做a视频 | 深夜视频在线观看免费 | 亚洲夜夜爽 | 超碰77| 国产又色又爽无遮挡免费动态图 | 99re8在线精品视频免费播放 | 中文字幕av专区dvd | 一个色av | 激情文学综合网 | 国产丝袜一区二区三区 | 爱视频福利网 | 日批av| 精品黄色| 在线免费91| 黄网在线免费看 | 亚洲网站在线免费观看 | 国产传媒视频在线观看 | 亚洲人成色777777精品音频 | 91久久视频| 三级自拍视频 | 中日韩免费毛片 | 日韩在线激情视频 | 欧美成人精品欧美一级乱 | 999精彩视频| 91久久精品无码一区二区 | 日韩白浆| 女人扒开屁股让我添 | 亚洲黄色小视频 | 国产午夜精品一区二区理论影院 | 日本黄色片网址 | 天天射影院 | 综合精品视频 | 精品无码久久久久久国产 | 国产又粗又黄又爽又硬的视频 | 中文字幕一区二区三区乱码不卡 | 天堂在线精品视频 | 久久免费国产视频 | 夜夜激情 | 国产偷国产偷av亚洲清高 | www.天天干 | 久久久精品福利 | 少妇高潮惨叫久久久久 | 黄色录像大片 | 亚洲一区二区福利视频 | 国产精品91一区 | 日韩亚州 | 91亚洲欧美 | 成人激情综合 | 亚洲特黄特色 | 色婷婷国产 | 毛片黄片免费看 | 久久久免费高清视频 | 久久免费资源 | 黄色网页免费看 | 无码人妻久久一区二区三区蜜桃 | 一区二区三区精 | 国产二区免费 | 日本高清不卡在线观看 | 成人涩涩软件 | 亚洲av电影一区 | 国产草草草 | 香蕉在线观看视频 | www.中文字幕 | 最近中文字幕第一页 | 黄色片视频| 久久人人看 | 欧美精品一区二区三区视频 | 少妇高潮网站 | 韩国三级视频在线 | 久久精品99国产精品日本 | 朝桐光av在线一区二区三区 | 国产成年人视频网站 | 播播成人网| 午夜男人天堂 | 天堂8中文在线 | 国产精品99无码一区二区 | www.涩涩爱 | 在线欧美一区 | 另类天堂 | 日本在线观看网站 | 91视频爱爱 | 欧美20p | 91麻豆精品国产91久久久更新时间 | 不卡av电影在线观看 | 91精品人妻一区二区 | 亚洲国产中文在线 | www.999av | 欧美怡红院 | 亚洲精品tv | 99re6在线精品视频免费播放 | 蜜臀av色欲a片无码精品一区 | 天堂av网手机版 | 91嫩草精品 | 久久亚洲一区二区三区四区五区 | 爱看av| 色图自拍 | 国产欧美专区 |