ListView setOnItemClickListener 通过添加按钮不起作用
Posted
技术标签:
【中文标题】ListView setOnItemClickListener 通过添加按钮不起作用【英文标题】:ListView setOnItemClickListener not working by adding button 【发布时间】:2011-10-05 21:54:57 【问题描述】:我有一个列表视图,每行都有文本和按钮,列表视图 setOnItemClickListener() 不起作用。是否可以以不同的方式处理项目单击和按钮单击事件(项目单击应调用 ActivityA,按钮单击应调用 ActivityB)。谁有解决办法
private ArrayList<String> userIDArr = null;
private ArrayList<String> userNameArr = null;
private DatabaseHelper dbHelper = null;
private ListView userListView=null;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view);
dbHelper = new DatabaseHelper(this.getApplicationContext());
Map<String,ArrayList<String>> displayMap = dbHelper.getUserListToDisplay();
userIDArr = displayMap.get("UserID");
userNameArr = displayMap.get("FirstName1");
userListView = (ListView) findViewById(R.id.listView2);
userListView.setAdapter(new UserListAdapter(this,userIDArr));
userListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
Toast.makeText(usersListActivity.this,
"Item in position " + position + " clicked", Toast.LENGTH_LONG).show();
);
public class UserListAdapter extends ArrayAdapter<String>
Activity context;
public UserListAdapter(Activity context, ArrayList<String> names)
super(context, R.layout.list_item, names);
this.context = context;
private class ViewHolder
public TextView UserNameAndID;
public TextView Description;
public Button UploadBtn;
@Override
public View getView(int position, View convertView, ViewGroup parent)
ViewHolder holder;
View rowView = convertView;
if (rowView == null)
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.list_item, null, true);
holder = new ViewHolder();
holder.UserNameAndID = (TextView) rowView.findViewById(R.id.User_detailsTxt);
holder.Description = (TextView) rowView.findViewById(R.id.User_status);
holder.UploadBtn = (Button) rowView.findViewById(R.id.uploadbutton);
holder.UploadBtn.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
Toast.makeText(usersListActivity.this," Button clicked",Toast.LENGTH_SHORT).show();
);
rowView.setTag(holder);
else
holder = (ViewHolder) rowView.getTag();
String s = userNameArr.get(position)+","+userIDArr.get(position);
holder.UserNameAndID.setText(s);
holder.Description.setText("U r in middle");
return rowView;
`
【问题讨论】:
【参考方案1】:尝试像这样设置您的按钮(或您想要处理单击列表项内的任何其他视图):
android:focusable="false"
android:focusableInTouchMode="false"
【讨论】:
@Ben Lee:我将这些添加到我的复选框中!还是行不通。我做错了什么?android:focusableInTouchMode="false"
解决了我的问题。我在自定义 LinearLayout 行中使用了两个 TextView。玉机器人...
ImageButton 将不起作用。在包含 ImageButton 的列表项视图中,设置 android:descendantFocusability="blocksDescendants"。
添加 android:clickable="false" 也可能是必需的(在布局设计器中打开和关闭它以使其显式添加到 XML)
警告:如果您使用的是 ImageButton,则需要使用 setFocusable(false),因为 ImageButton 的构造函数会在从 xml 文件膨胀后启用此属性。但是很好的答案【参考方案2】:
有时列表仍然无法让 Click Listener 通过。在这种情况下,您可能必须再添加一个属性。
android:descendantFocusability="blocksDescendants"
并且必须将此属性添加到您提供 ListView 元素的 XML 的最顶层布局中。
【讨论】:
所以没有其他人会做我刚才所做的事情:如果您的行中有需要关注的内容,例如 EditText,这将是不可取的。我现在觉得自己很蠢。 就我而言,这个建议很有帮助。我有一个 TextView 和 RadioButton,第一个没有点击,第二个没有选择 TextView。我在 RadioButton 中写了“android:clickable="false"”。 这是按钮为ImageButton时的解决方案 奇怪的是,这个解决方案对我有用。 OnItemClickListener 在不影响后代事件的情况下工作。不知道为什么它会起作用,所以......去想一想。【参考方案3】:如果您的列表视图中有一个活动视图/可聚焦视图,那么它将禁用 onItemClickListener
... 您可以尝试通过添加以下内容使其无法聚焦:
android:focusable="false"
到通常可聚焦的任何视图。
【讨论】:
【参考方案4】:击球手的事情是将Listener
添加到整个rowView
和Button
内Adapter
。
像这样。
public class MyAdapter extends BaseAdapter implements View.OnClickListener
@Override
public View getView(int position, View convertView, ViewGroup parent)
View rowView = convertView;
if(rowView == null)
//intialize rowView, and set onclick listener only once.
rowView = someIntilizationMehhodOrInflatorMethod();
//add listener to the button also and also to the row view
rowView.setOnClickListener(this);
//all your inflation and setting values goes here and at the end,
//set position as tag to get the correct position, rather buggy one.
rowView.setTag(String.valueOf(position));
return rowView;
public void onClick(View v)
//now get the tag of View v and convert it to integer.
int pos = Integer.parseInt(v.getTag().toString());
Toast.makeText(context,"Item in position " + pos + " clicked",Toast.LENGTH_LONG).show();
【讨论】:
这有什么更好的地方?您正在为每个数据元素创建一个 onClickListener,而只有一个侦听器。您的示例甚至没有回收哪些视图。 @J.Romero 这只是一个例子,尽管还有很多代码优化空间。但是我刚刚更新了代码。【参考方案5】:尝试为每个Button
、ImageButton
和View
设置setClickable(false)
,如下所示:
view.setClickable(false);
button.setClickable(false);
imagebutton.setClickable(false);
你也必须添加
android:descendantFocusability="blocksDescendants"
到主(第一级)布局
【讨论】:
我发现设置 blocksDescendants 就足够了,不需要取消可聚焦等。Android 4.1【参考方案6】:不要添加按钮,而是添加ImageView
并提供setOnItemClcik
侦听器,这样可以正常工作。
public View getView(final int position, View convertView, ViewGroup parent)
MyViewHolder mViewHolder;
if(convertView == null)
convertView = inflater.inflate(R.layout.youtubesearchrow, null);
mViewHolder = new MyViewHolder();
mViewHolder.alarm = (ImageView)convertView.findViewById(R.id.alarm);
convertView.setTag(mViewHolder);
else
mViewHolder = (MyViewHolder) convertView.getTag();
mViewHolder.tvTitle = detail(convertView, R.id.tvTitle,
// mViewHolder.tvDesc = detail(convertView, R.id.tvDesc,
mViewHolder.ivIcon = detail_image(convertView, R.id.ivIcon,
mViewHolder.alarm.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
);
return convertView;
【讨论】:
【参考方案7】:像android:clickable="false"
一样将父可点击属性设置为 false。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:clickable="false"
android:orientation="vertical">
再次面临问题,然后为所有子视图添加这个可点击的 false。
【讨论】:
【参考方案8】:我也遇到了同样的错误。如果在列表布局中有任何按钮可以将其替换为TextView
,即ImageButton
与ImageView
。供参考,他们是我的代码:
private Activity activity;
private LayoutInflater inflater;
private List<ItemList> itemListsItems;
private Bookmark_SharedPref pref;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public CustomListAdapter_Item(Activity activity,List<ItemList> itemListsItems)
this.activity=activity;
this.itemListsItems=itemListsItems;
pref = new Bookmark_SharedPref(activity);
@Override
public int getCount()
return itemListsItems.size();
@Override
public Object getItem(int position)
return itemListsItems.get(position);
@Override
public long getItemId(int position)
return position;
@Override
public View getView(final int position, View convertView, ViewGroup parent)
View v = convertView;
ViewHolder holder;
if(inflater == null)
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null)
convertView = inflater.inflate(R.layout.item_layout,null);
holder = new ViewHolder();
convertView.setTag(holder);
else
holder = (ViewHolder)convertView.getTag();
if(imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
holder.img = (NetworkImageView)convertView.findViewById(R.id.item_image);
holder.Title = (TextView)convertView.findViewById(R.id.item_title);
holder.Cat = (TextView)convertView.findViewById(R.id.item_category);
holder.id = (TextView)convertView.findViewById(R.id.itemid);
holder.Desc = (TextView)convertView.findViewById(R.id.item_description);
holder.book = (ImageView)convertView.findViewById(R.id.bookmark_star);
// getting blog data or the row
ItemList il = itemListsItems.get(position);
//setting image
holder.img.setImageUrl(il.getImageUrl(), imageLoader);
// setting title
holder.Title.setText(il.getTitle());
//setting category
holder.Cat.setText(il.getCategory());
//setting blog id
holder.id.setText(il.getId());
//setting description
holder.Desc.setText(il.getDescription());
//bookmarking the post
holder.book.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
itemListsItems.get(position).isFav = !itemListsItems.get(position).isFav;
((ImageView)v.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star);
if(itemListsItems.get(position).isFav)
String data = Integer.toString(itemListsItems.get(position).id);
Toast.makeText(v.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show();
pref.addPref(data);
else
String data = Integer.toString(itemListsItems.get(position).id);
Toast.makeText(v.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show();
pref.removePref(data);
//notifyDataSetChanged();
);
((ImageView)convertView.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star);
/*
if(itemListsItems.get(position).isFav)
String data = Integer.toString(itemListsItems.get(position).id);
Toast.makeText(convertView.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show();
pref.addPref(data);
else
String data = Integer.toString(itemListsItems.get(position).id);
//Toast.makeText(convertView.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show();
pref.removePref(data);
*/
return convertView;
private static class ViewHolder
public TextView Title, Desc,Cat,id;
ImageView book;
NetworkImageView img;
还要记住将列表布局设置为android:focussable="true"
,并为该按钮/文本参数使用android:focussable="false"
。
【讨论】:
更正它应该是 android:focusable="false" 不可聚焦【参考方案9】:将android:focusable="false"
属性添加到按钮和父视图添加android:descendantFocusability="blocksDescendants"
属性,如下所示。
<RelativeLayout
android:layout_
android:layout_
android:descendantFocusability="blocksDescendants">
<ImageButton
android:id="@+id/sell_button"
android:layout_
android:focusable="false"
android:layout_
android:src="@drawable/ic_sell" />
</RelativeLayout>
【讨论】:
【参考方案10】:令人惊讶的是,XML 的变化导致 java 中的 setonitemclicked 为我工作..
android:descendantFocusability="blocksDescendants"
android:focusable="false"
android:focusableInTouchMode="false"
【讨论】:
【参考方案11】:我不知道确切原因,但有时当您设置适配器时,侦听器会被清除。然后,您必须在setAdapter
或setListAdapter
之后调用setOnClickListener
。
【讨论】:
【参考方案12】:从ListView
的内部客户视图中删除android:clickable="true"
。
【讨论】:
以上是关于ListView setOnItemClickListener 通过添加按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章