Gab*_*mas 3 android listview click android-arrayadapter
正如标题所示,当我点击项目内的视图时,我想知道项目的确切位置.
假设我在ArrayAdapter的getView()方法中有以下代码:
...
holder = new ViewHolder ();
holder.iconAction = (ImageView)convertView.findViewById (R.id.download_item_iconAction);
holder.iconAction.setOnClickListener (new View.OnClickListener(){
@Override
public void onClick (View v){
//Item X is clicked
}
});
...
Run Code Online (Sandbox Code Playgroud)
在onClick()中,我知道点击的视图,v,但我不知道项目的位置.
我们来做个伎俩.当getView()创建视图时,我将在ViewHolder中保存位置:
public View getView (int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null){
holder = new ViewHolder ();
holder.iconAction = (ImageView)convertView.findViewById (id);
holder.iconAction.setOnClickListener (new View.OnClickListener(){
@Override
public void onClick (View v){
int pos = (Integer)v.getTag ();
}
});
holder.iconWait.setTag (position);
...
}else{
holder = (ViewHolder)convertView.getTag ();
}
...
}
Run Code Online (Sandbox Code Playgroud)
此代码有效......但并非总是如此.如果必须滚动列表以查看视图被回收的所有项目.假设列表有10个元素,只有5个可见(可见意味着:如果我们看到一个项目的1个像素行,则此项目可见).现在,如果我们向下滚动,我们将看到第六个元素,但第一个(0)仍然可见.我们滚动一点,第一个元素将被隐藏,我们将看到第七个元素出现,但是这个新元素的视图是第一个元素(0)的视图.
所以我保存位置:0,1,2,3,4和5.第七个元素(6)将保存位置0:错误.
获取单击回调的另一种方法是使用ListView的OnItemClickListener侦听器:
listView = getListView ();
listView.setOnItemClickListener (new AdapterView.OnItemClickListener(){
@Override
public void onItemClick (AdapterView<?> parentView, View childView, int position, long id){
...
}
});
Run Code Online (Sandbox Code Playgroud)
如果我向下滚动,我会得到确切的位置,但是通过这种方式,我会在单击项目时收到回调,无论点击的子视图如何.
谢谢.
你几乎就在那里,你需要做的就是在if/else子句之后设置标签.这是为了确保在回收视图时以及从new创建视图时更新标记.
例如
if (convertView == null){
holder = new ViewHolder ();
...
}else{
holder = (ViewHolder)convertView.getTag ();
}
holder.iconWait.setTag (position);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5784 次 |
| 最近记录: |