列表视图中的 OnItemClickListener 与 OnclickListener android

OnItemClickListener vs OnclickListener in listview android

由于代码原因,这会很长。所以我有一个关于 OnItemclickListener 和 OnclickListener 的问题,这里我有两个代码,每个代码都有效,所以有没有偏好使用两者之一或者我可以使用任何人??? 这是带有 OnItemClickListener

的代码
public class MainActivity extends AppCompatActivity {
    private ArrayList<String> numbers=new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //a listview with id "list"

        ListView numberLV = (ListView) findViewById(R.id.list);
        numbers.add("one");
        numbers.add("two");
        numbers.add("three");
        numbers.add("four");
        // and so on
        listAdapter itemadapter=new listAdapter(this,numbers);
        numberLV.setAdapter(itemadapter);
        numberLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String num=numbers.get(position);
                String display="You have clicked "+num;
                Toast.makeText(MainActivity.this,display,Toast.LENGTH_SHORT).show();
            }
        });
    }
}
class listAdapter extends ArrayAdapter<String> {
    public listAdapter(@NonNull Context context, ArrayList<String> numbers){
        super(context,0,numbers);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listItemView = convertView;
        if(listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_num, parent, false);
        }
        TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
        String num=getItem(position);
        tvnum.setText(num);
        return listItemView;
    }
}

这是一个带有 OnClickListener 的

public class MainActivity extends AppCompatActivity {
    private ArrayList<String> numbers=new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //a listview with id "list"

        ListView numberLV = (ListView) findViewById(R.id.list);
        numbers.add("one");
        numbers.add("two");
        numbers.add("three");
        numbers.add("four");
        // and so on
        listAdapter itemadapter=new listAdapter(this,numbers);
        numberLV.setAdapter(itemadapter);
    }
}
class listAdapter extends ArrayAdapter<String> {
    public listAdapter(@NonNull Context context, ArrayList<String> numbers){
        super(context,0,numbers);
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listItemView = convertView;
        if(listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_num, parent, false);
        }
        TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
        String num=getItem(position);
        tvnum.setText(num);
        listItemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String display="You have clicked "+getItem(position);
                Toast.makeText(getContext(),display,Toast.LENGTH_SHORT).show();
            }
        });
        return listItemView;
    }
}

两个代码对我来说都正常工作,但困惑是第二个代码是对还是错??

适配器

如上面第一条评论所述,setOnItemClickListener 是将点击侦听器附加到适配器项目的首选方式。

查看

在你的第二种情况下,你在 getView 方法中的单个项目上附加了 setOnClickListener 这也是有效的,因为在这种情况下 ItemView 是一个 间接子类View 上,最初在 setOnClickListener 上声明。

我认为 setOnItemClickListener() 比 onClickListener() 最好,因为,

  1. 它让您在 activity 或 ListView 定义的片段中单击单行。
  2. 当你想在 onItemClickListener() 上执行操作时更容易,例如打开另一个 activity 或片段。
  3. 我们可以在项目点击方法中使用 view.getTag() 方法获取选定行列表对象。
  4. 如果您有来自 Web api 的调用数据,例如 soap 或 restful 在列表视图项上单击,那么实现它是一种简单的方法。