我有一个列表视图,每行有文本和按钮,列表视图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;
}
}
}`
答案 0 :(得分:255)
尝试设置按钮(或您要处理的任何其他视图在列表项内单击),如下所示:
android:focusable="false"
android:focusableInTouchMode="false"
答案 1 :(得分:116)
有时List仍然无法使Click Listener通过。在这种情况下,您可能需要再添加一个属性。
android:descendantFocusability="blocksDescendants"
此属性必须添加到您提供ListView元素的XML的最顶层布局中。
答案 2 :(得分:14)
如果您在列表视图中有一个活动的视图/可聚焦视图,那么它将禁用onItemClickListener
...您可以尝试通过添加以下内容使其无法聚焦:
android:focusable="false"
到任何通常可以关注的视图。
答案 3 :(得分:8)
更重要的是将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();
}
}
答案 4 :(得分:4)
尝试为每个Button,ImageButton等设置setClickable(false),并像这样查看:
view.setClickable(false);
button.setClickable(false);
imagebutton.setClickable(false);
您还必须添加
android:descendantFocusability="blocksDescendants"
到主(第一级)布局
答案 5 :(得分:2)
而不是添加按钮添加imageview并提供set on项目单击侦听器,它可以正常工作
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;
}
答案 6 :(得分:1)
我也得到了同样的错误。如果在列表布局中有任何按钮,则将其替换为带有ImageView的textView,即ImageButton。对于参考,他们是我的代码:
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 =&#34; true&#34;对于那个按钮/文本参数,使用android:focussable =&#34; false&#34;
答案 7 :(得分:0)
我不确切知道为什么,但有时当你设置适配器时,清除了监听器。然后,您必须在setAdapter或setListAdapter之后调用setOnClickListener。
答案 8 :(得分:0)
删除android:clickable =&#34; true&#34;来自listView的内部服装视图
答案 9 :(得分:0)
将父点击属性设为false,这样&#39; android:clickable =&#34; false&#34; &#39;。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="false"
android:orientation="vertical"
>
再次遇到问题,然后对于所有子视图添加此可点击的错误。
答案 10 :(得分:0)
向按钮添加 android:focusable =“ false” 属性,并向父视图添加 android:descendantFocusability =“ blocksDescendants” 属性。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants">
<ImageButton
android:id="@+id/sell_button"
android:layout_width="wrap_content"
android:focusable="false"
android:layout_height="wrap_content"
android:src="@drawable/ic_sell" />
</RelativeLayout>
答案 11 :(得分:0)
令人惊讶的是,注意到XML的变化如何导致java中的setonitemclicked对我有用。
android:descendantFocusability="blocksDescendants"
android:focusable="false"
android:focusableInTouchMode="false"