Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 处理listview项目中不同视图单击的最佳实践?_Android_Listview_Click - Fatal编程技术网

Android 处理listview项目中不同视图单击的最佳实践?

Android 处理listview项目中不同视图单击的最佳实践?,android,listview,click,Android,Listview,Click,为了处理不同的视图单击,我在getView()中为视图设置了侦听器。如果添加了很多项目,速度会有点慢 public View getView(int position, View convertView, ViewGroup parent) { holder.icon_iv = (ImageView) convertView.findViewById(R.id.app_icon_iv); holder.icon_iv.setOnClickL

为了处理不同的视图单击,我在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()中执行此操作,但视图arg1无法在单击视图时分辨出差异。有人能告诉我怎么处理它吗

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

}

我认为您应该使用标记:您只需通过setTag()方法为每个视图提供一个标记,然后在onClick方法中检查已单击视图的标记

如果您对列表项的每个子项都有共同的执行,那么您必须使用
onItemClick()
listner,否则每个子项都有自己的单击侦听器。还有一件事是,当您使用复选框或单选按钮时,最好使用他们的检查更改侦听器,而不是单击侦听器。

您可以使用getId()函数

public void onItemClick(适配器视图arg0、视图arg1、内部arg2、长arg3){
if(arg1.getId()==R.id.app_图标_iv){
//为这个观点做点什么
}
否则{
//为另一个视图做一些事情
}
}

使用一个
OnClickListener
来处理一种事件

示例代码

适配器内部

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

arg2具有列表项的索引,因此您可以使用该索引执行任何操作。arg1.getId()无法分辨不同的视图,它始终返回一个常量值。您可以将该常量值与视图的Id匹配,然后使用itOk,我将尝试一下,稍后让您知道。我有“无法从对象转换为int”错误,它是通过转换为整数而不是int来修复的。
 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
}

}
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);
   ...
}