Android 处理listview项目中不同视图单击的最佳实践?
为了处理不同的视图单击,我在getView()中为视图设置了侦听器。如果添加了很多项目,速度会有点慢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
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);
...
}