为了处理不同的视图点击,我在getView()中为视图设置了监听器。如果添加了很多项目,它会有点慢。
public View getView(int position, View convertView, ViewGroup parent) {
holder.icon_iv = (ImageView) convertView.findViewById(R.id.app_icon_iv);
holder.icon_iv.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
...
}
});
holder.checkbox_iv = (CheckBox) convertView.findViewById(R.id.history_checkbox_iv);
holder.checkbox_iv.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
...
}
});
}
所以我想在onItemClick()中这样做,但是View arg1无法区分点击的视图。谁能告诉我该怎么做呢?
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
}
编辑: 谢谢,我决定这样做,它完美无缺:
holder.item_ll.setTag(position);
holder.item_ll.setOnClickListener(mItemClickListener);
holder.checkbox_iv.setTag(position);
holder.checkbox_iv.setOnClickListener(mItemClickListener);
public View.OnClickListener mItemClickListener = new View.OnClickListener() {
public void onClick(View view) {
if (view.getTag() instanceof Integer) {
int position = (Integer) view.getTag();
HistoryItem item = adapter.get(position);
if (view.getId() == R.id.checkbox_iv) {
...
} else if (view.getId() == R.id.item_ll) {
...
}
}
}
};
答案 0 :(得分:4)
使用一个OnClickListener
来处理一种事件
示例代码
在Adapter
public interface CustomListListener
{
void onEventA(index int);
void onEventB(index int);
}
public View.OnClickListener mButtonATypeClickListener = new View.OnClickListener(){
public void onClick(View view)
{
int position = (Integer) view.getTag();
mListener.onEventA(position);
}
}
public View.OnClickListener mButtonBTypeClickListener = new View.OnClickListener(){
public void onClick(View view)
{
int position = (Integer) view.getTag();
mListener.onEventB(position);
}
}
public View getView(int position, View convertView, ViewGroup parent) {
...
buttonA.setTag(position);
buttonA.setOnClickListener(mButtonATypeClickListener);
buttonB.setTag(position);
buttonB.setOnClickListener(mButtonBTypeClickListener);
...
}
现在,您只需在CustomListListener
中实施Activity
。
答案 1 :(得分:3)
您可以使用getId()函数
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if(arg1.getId()==R.id.app_icon_iv){
//Do something for that view
}
else{
// Do something for another view
}
}
答案 2 :(得分:1)
我认为你应该使用标签:你只需通过setTag()方法为每个视图提供一个标签,然后在onClick方法中检查已被点击的视图的标签
答案 3 :(得分:1)
如果您对列表项的每个子项都有共同执行,那么您必须使用onItemClick()
listner,因为每个孩子都有自己的点击监听器。还有一件事是当你使用 CheckBox 或 RadioButton 时,最好使用他们的检查更改监听器而不是点击监听器。