Ответ 1
Проблема была связана с андроидом: focusable = "true" в моем макете, поскольку я удалил это, он работал нормально, все предложенные ответы также работают нормально. Спасибо, все.
Я пытаюсь получить клики по элементам RecyclerView
, для которых я использую механизм обратного вызова. Я создал интерфейс OnItemClickListener
и внутри пользовательского адаптера, я написал логику для обнаружения щелчка с помощью View.OnClickListener
. Но я получаю обратный вызов в myActivity после двойного нажатия на любой элемент в списке. Не понимаю, что происходит здесь!
Код внутри действия:
mAdapter = new AppAdapter(this, mAppList, new OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
Toast.makeText(SelectAppActivity.this, "Hello", Toast.LENGTH_SHORT).show();
}
});
recyclerview.setAdapter(mAdapter);
Код для интерфейса:
public interface OnItemClickListener {
void onItemClick(View v, int position);
}
Код для пользовательского адаптера:
public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ItemViewHolder> {
List<App> mAppList;
List<App> mFilterAppList;
Activity context;
OnItemClickListener onItemClickListener;
public AppAdapter(Activity context, List<App> appList, OnItemClickListener onItemClickListener) {
super();
this.context = context;
this.mAppList = appList;
this.mFilterAppList = appList;
this.onItemClickListener = onItemClickListener;
}
@Override
public ItemViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_app_list, parent, false);
final ItemViewHolder viewHolder = new ItemViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(v,4);
}
});
return viewHolder;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
final App app = mAppList.get(position);
holder.name.setText(app.getmName());
holder.icon.setImageDrawable(app.getmAppIcon());
}
@Override
public int getItemCount() {
return mAppList.size();
}
public void setFilter(List<App> appList) {
mAppList = new ArrayList<>();
mAppList.addAll(appList);
notifyDataSetChanged();
}
public static class ItemViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public ImageView icon;
public ItemViewHolder(View view) {
super(view);
name = (TextView) itemView.findViewById(R.id.app_name);
icon = (ImageView) itemView.findViewById(R.id.app_icon);
}
}
}
Проблема была связана с андроидом: focusable = "true" в моем макете, поскольку я удалил это, он работал нормально, все предложенные ответы также работают нормально. Спасибо, все.
Существует также известная ошибка, для тех из вас, кто приземлится здесь, проверьте этот вопрос, который ссылается на этот обходной путь.
Добавить элемент Click-listener в ItemViewHolder, он отлично работает.
public static class ItemViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public ImageView icon;
public ItemViewHolder(View view) {
super(view);
name = (TextView) itemView.findViewById(R.id.app_name);
icon = (ImageView) itemView.findViewById(R.id.app_icon);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//getLayoutPosition is a method of RecyclerView
onItemClickListener.onItemClick(v,getLayoutPosition());
}
});
}
}
Просто переместите свой onClick в onBindViewHolder и установите щелчок, как показано ниже, Надеюсь, он решит вашу проблему....
holder.icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(v,4);
}
});
Переместите свой onClickListner из onCreateViewHolder в onBindViewHolder
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
final App app = mAppList.get(position);
holder.name.setText(app.getmName());
holder.icon.setImageDrawable(app.getmAppIcon());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(v , position);
}
});
}
Добавьте их в свой родительский элемент в R.layout.item_app_list
android:clickable="false"
android:focusable="false"
В моем приложении мне действительно нужно было оставить android: focusable = "true", поэтому вместо использования clickListener я использую слушатель фокуса:
dataItemViewHolder.itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
System.out.println("onFocusChange");
}
}
});
В моем корневом представлении:
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
Вы должны просто знать, что вы потеряете эффекты кликов и анимации.
В моем случае я попробовал некоторые из приведенных решений, но мне не повезло с этим. После некоторого поиска я попробовал ниже вещь, а затем работает нормально.
XML
<android.support.v7.widget.RecyclerView
---------------------------
android:nestedScrollingEnabled="false" />
Программный
recyclerView.setNestedScrollingEnabled(false);
если с помощью RecyclerView в NestedScrollView добавьте эту строку в RecyclerView:
android:nestedScrollingEnabled="false"
Я надеюсь, что это поможет вам.