最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ListView的OnItemClickListener詳解

 更新時間:2016年07月28日 11:12:22   作者:wula0010  
這篇文章主要介紹了Android ListView的OnItemClickListener詳解的相關(guān)資料,涉及到OnItemClickListener的position和id參數(shù)做詳細的解釋的知識點,非常不錯,具有參考借鑒價值,需要的朋友參考下

我們在使用ListView的時候,一般都會為ListView添加一個響應事件android.widget.AdapterView.OnItemClickListener。本文主要在于對OnItemClickListener的position和id參數(shù)做詳細的解釋,我相信有些人在這上面走了些彎路。

先來看一下官方的文檔

position The position of the view in the adapter.

id The row id of the item that was clicked.

而這兩行字并沒有解釋清楚position和id的區(qū)別。另外,我們還有個Adapter的getView方法。
public abstract View getView (int position, View convertView, ViewGroup parent)
這里也有一個position。

初步接觸ListView的同學,一般會直接繼承ArrayAdapter,然后(比如我),就想當然的認為OnItemClick的position和getView的position是一樣的啊。于是我們就getItem(position)來獲取相應的數(shù)據(jù)。

那么這段代碼有沒有錯呢?如果有錯的話,在什么情況會出錯呢?

第一個問題的答案是,當我們?yōu)長istView添加headerView或者footerView之后,這段代碼就不一定是我們想要的了。
出現(xiàn)問題的原因在于,當我們?yōu)長istView添加headerView或者footerView之后,ListView在setAdapter時,做了一些事情,這導致,Adapter和OnItemClickListener中的position含義發(fā)生了變化。

我們可以來看看ListView中setAdapter的實現(xiàn)

public 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; 
} 

可以看出,如果這個ListView存在headerView或者footerView的話,那么會在我們傳入的adapter外面在封裝一層HeaderViewListAdapter,這是一個專門用來自動處理headerView和footerView的adapter。在ListView中,本身不區(qū)分headerView,footerView。ListView可以理解成是只負責管理一組View的數(shù)組的UI(ViewGroup),headerView和footerView都委托給HeaderViewListAdapter來處理。(從這里也可以看到為什么API文檔中提到,addFooterView和addHeaderView要在setAdapter函數(shù)之前調(diào)用,如果在之后調(diào)用,那么就不會生成HeaderViewListAdapter,從而導致顯示不出headerView和footerView)。

回到開頭的問題,position和id有啥區(qū)別。為此,我們找一下position和id是怎么傳進來的。

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 happen 
if (mDataChanged) return; 
final ListAdapter adapter = mAdapter; 
final int motionPosition = mClickMotionPosition; 
if (adapter != null && mItemCount > 0 && 
motionPosition != INVALID_<strong>POSITION</strong> && 
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 click 
if (view != null) { 
performItemClick(view, motionPosition, adapter.getItemId(motionPosition)); 
} 
} 
} 
} 

可以看到,position事實上就是ListView中被點擊的view的位置。注意,在ListView中是不負責處理headerView和footViewer的,所以,這個位置應該是這個被點擊的view在數(shù)組[所有的headerView,用戶添加的view,所有的footerView]中的位置(請自行參考HeaderViewListAdapter的getView實現(xiàn))。而id是來自于adapter.getItemId(position)。
對于ArrayAdapter的getItemId函數(shù),實現(xiàn)就是return position。id和position是一致的。

然而,對于HeaderViewListAdapter

public long getItemId(int <strong>position</strong>) { 
int numHeaders = getHeadersCount(); 
if (mAdapter != null && <strong>position</strong> >= numHeaders) { 
int adjPosition = <strong>position</strong> - numHeaders; 
int adapterCount = mAdapter.getCount(); 
if (adjPosition < adapterCount) { 
return mAdapter.getItemId(adjPosition); 
} 
} 
return -1; 
} 

實現(xiàn)邏輯是,如果position指向了headerView或footerView,那么返回-1,否則,將返回在用戶view數(shù)組的位置。
也就是說

id=position-headerView的個數(shù)(id < headerviewer的個數(shù)+用戶view的個數(shù)),否則=-1

因此,OnItemClickListener的正確實現(xiàn)如下:

void onItemClick(AdapterViewparent, View view, int <strong>position</strong>, long id){ 
if(id == -1) { 
// 點擊的是headerView或者<strong>footerView</strong> 
return; 
} 
int realPosition=(int)id; 
T item=getItem(realPosition); 
// 響應代碼 
}

相關(guān)閱讀:

Android 中ListView setOnItemClickListener點擊無效原因分析

以上所述是小編給大家介紹的Android ListView的OnItemClickListener詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android實現(xiàn)從底部彈出的Dialog示例(一)

    Android實現(xiàn)從底部彈出的Dialog示例(一)

    這篇文章主要介紹了Android實現(xiàn)從底部彈出的Dialog示例(一),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Flutter SystemChrome使用方法詳解

    Flutter SystemChrome使用方法詳解

    這篇文章主要為大家介紹了Flutter SystemChrome使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android Jetpack系列之App Startup使用詳解

    Android Jetpack系列之App Startup使用詳解

    這篇文章主要為大家介紹了Android Jetpack系列之App Startup使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Android工程師面試題大全

    Android工程師面試題大全

    這篇文章主要為大家分享了Android工程師面試題,內(nèi)容很豐富,結(jié)合網(wǎng)上各位的大神秒下的面試題做個總結(jié),感興趣的小伙伴們可以參考一下
    2016-02-02
  • 通過實例簡單講解Android App中的Activity組件

    通過實例簡單講解Android App中的Activity組件

    這篇文章主要介紹了通過Android App中的Activity組件,包括Activity的定義和繼承以及啟動等基本知識,需要的朋友可以參考下
    2016-04-04
  • Android Studio preview 不固定及常見問題的解決辦法

    Android Studio preview 不固定及常見問題的解決辦法

    preview 可以幫助您預覽您的布局文件將如何在用戶的設備上呈現(xiàn)。這篇文章主要介紹了Android Studio preview 不固定及常見問題的解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android使用Notification實現(xiàn)通知功能

    Android使用Notification實現(xiàn)通知功能

    這篇文章主要為大家詳細介紹了Android使用Notification實現(xiàn)通知功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Android EditText長按菜單中分享功能的隱藏方法

    Android EditText長按菜單中分享功能的隱藏方法

    Android EditText控件是經(jīng)常使用的控件,下面這篇文章主要給大家介紹了關(guān)于Android中EditText長按菜單中分享功能的隱藏方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • Android EditText限制輸入字數(shù)的方法

    Android EditText限制輸入字數(shù)的方法

    這篇文章主要介紹了Android EditText限制輸入字數(shù)的方法,涉及Android針對EditText文本與字符串操作相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android ViewPager導航小圓點實現(xiàn)無限循環(huán)效果

    Android ViewPager導航小圓點實現(xiàn)無限循環(huán)效果

    這篇文章主要為大家詳細介紹了Android ViewPager導航小圓點實現(xiàn)無限循環(huán)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

寿阳县| 临泽县| 泰兴市| 阳原县| 郧西县| 阿克苏市| 城步| 双柏县| 获嘉县| 南乐县| 汉沽区| 托克逊县| 应用必备| 公主岭市| 宜都市| 永和县| 德兴市| 宁德市| 通州区| 康乐县| 道孚县| 呼伦贝尔市| 三门峡市| 普陀区| 册亨县| 平湖市| 正阳县| 兰考县| 且末县| 昌平区| 临高县| 南和县| 永新县| 盐山县| 克拉玛依市| 福州市| 隆林| 泽普县| 福州市| 读书| 错那县|