У меня есть представление списка с текстом и кнопкой в каждой строке, представление списка 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;
}
}
}`
android:focusableInTouchMode="false"
решает мой. Я использую два TextView в настраиваемой строке LinearLayout. Юк андроид ...Иногда список по-прежнему не может передать прослушиватель кликов. И в этом случае вам, возможно, придется добавить еще один атрибут.
android:descendantFocusability="blocksDescendants"
И этот атрибут нужно добавить в самый верхний макет вашего XML, где вы предоставили элементы ListView.
источник
Если у вас есть активное представление / представление с фокусировкой в представлении списка, оно отключится
onItemClickListener
... вы можете попытаться сделать его нефокусируемым, добавив:android:focusable="false"
к любому представлению, которое обычно фокусируется.источник
Кляр нужно добавлять как
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(); } }
источник
Попробуйте установить
setClickable(false)
для каждогоButton
,ImageButton
и т.д. иView
вот так:view.setClickable(false); button.setClickable(false); imagebutton.setClickable(false);
Также вам нужно добавить
android:descendantFocusability="blocksDescendants"
на основной (первый уровень) макет
источник
Вместо добавления кнопки добавьте
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; }
источник
Я тоже получаю ту же ошибку. Если в списке макет вы имеете любую кнопку , чтобы заменить его ,
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"
атрибут к кнопке, а к родительскому представлению добавьте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>
источник
Удивительно заметить, как изменение XML приводит к тому, что setonitemclicked в java Работал для меня ..
android:descendantFocusability="blocksDescendants" android:focusable="false" android:focusableInTouchMode="false"
источник
Сделайте родительский атрибут clickable равным false, как это
android:clickable="false"
.<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">
Опять сталкиваюсь с проблемой, затем для всех дочерних представлений добавьте этот кликабельный false.
источник
Я точно не знаю почему, но иногда при установке адаптера слушатели очищаются. Затем вы должны позвонить
setOnClickListener
послеsetAdapter
илиsetListAdapter
.источник
Убрать
android:clickable="true"
из внутреннего пользовательского вида изListView
.источник