【问题标题】:How to get selected item from RecyclerView list?如何从 RecyclerView 列表中获取所选项目?
【发布时间】:2016-01-04 12:54:50
【问题描述】:

我已经创建了一个界面来扩展 Recycler View 的功能,并可以在列表的每个项目上点击收听,但我无法让它工作。当我点击任何项目时,什么都没有发生。这是我的代码:

// METHOD FOR INITIALIZATION OF RECYCLER VIEW
public void initRecyclerView() {
    // SETTING ARRAY FOR CATEGORIES
    final CategoryItem categoryItem[] = { new CategoryItem("Birthday", R.drawable.birthday_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image),
                                    new CategoryItem("Anniversary", R.drawable.anniversary_image)};

    // FINDING RECYCLER VIEW IN LAYOUT
    recyclerView = (RecyclerView) findViewById(R.id.list);
    recyclerView.setLayoutManager(new GridLayoutManager(this, 2));

    adapter = new CategoriesListAdapter(categoryItem);
    recyclerView.setAdapter(adapter);

    // SETTING ON CLICK LISTENER ON ADAPTER
    adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void setOnItemClick(View view, int position) {
            String clickedItem = String.valueOf(position);
            if ( clickedItem.equals("Birthday") ) {
                Toast.makeText(MainActivity.this, "Clicked on Birthday!", Toast.LENGTH_SHORT).show();
            }
        }
    });
    recyclerView.setItemAnimator(new DefaultItemAnimator());

}

更新:

适配器

public class CategoriesListAdapter extends RecyclerView.Adapter<CategoriesListAdapter.ViewHolder> {

private CategoryItem[] categoryItems;
private static OnItemClickListener onItemClickListener;

public CategoriesListAdapter(CategoryItem[] categoryItems) {
    this.categoryItems = categoryItems;
}

@Override
public CategoriesListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false);
    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}


@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

    viewHolder.txtViewTitle.setText(categoryItems[position].getTitle());
    viewHolder.imgViewIcon.setImageResource(categoryItems[position].getImage());

}

// inner class to hold a reference to each item of RecyclerView
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.image);
        itemLayoutView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        onItemClickListener.setOnItemClick(v, getAdapterPosition());
    }
}

public void setOnItemClickListener (final OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

// Return the size of your itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
    return categoryItems.length;
}

}

界面:

public interface OnItemClickListener {

public void setOnItemClick(View view, int position);

}

如果选择了生日,它应该显示 toast 消息,但它不显示任何内容。我正在实例化类数组,但我不知道如何收听点击的项目。那里的答案并没有帮助我解决我的问题。

【问题讨论】:

标签: android onclicklistener android-recyclerview


【解决方案1】:

目前您正在根据 OnItemClickListener 方法 setOnItemClick 中的字符串“生日”检查您的位置

String clickedItem = String.valueOf(position);
if ( clickedItem.equals("Birthday") ) {
    ...
}

这永远不会是真的。尝试获取位置项目并根据“生日”检查其第一个参数,或者将您的 Toast 从该 if 语句中取出并打印出位置编号以开始了解那里发生了什么

@Override
public void setOnItemClick(View view, int position) {
    Toast.makeText(MainActivity.this, "Clicked item on position: " + position, Toast.LENGTH_SHORT).show();
}

【讨论】:

  • 这是有效的,但我将如何为每个点击的项目启动新的指定活动?
  • 在 ViewHolder OnClick 方法中,您可以返回 onItemClickListener.setOnItemClick(v, categoryItems[getAdapterPosition()]) 而不仅仅是位置编号,并使用该对象在开始新活动时添加一些额外内容(当然你需要相应地编辑你的界面和其他地方)。如何开始活动..您可以从stackoverflow.com/questions/4186021/…获得一个示例
  • 我尝试在类 CategoryItem 的接口中更改 setOnItemClick() 方法的第二个参数,并在 setOnItemClick() 方法中将其传递给适配器,但没有成功
  • 您是否最终得到类似在 MainActivity 中的回调 setOnItemClick(View view, CategoryItem item) (您应该能够从那里获得项目的标题,并且可能出于测试目的使用 Toast 显示它)并从您调用onItemClickListener.setOnItemClick(v, categoryItems [getAdapterPosition()]); 的onClick 方法中的适配器?它是否引发了某种异常或发生了什么?
  • 我试图检查项目,类 CategoryItem 的实例是否等于标题,但没有任何反应。我在 toast 消息中对此进行了测试。
【解决方案2】:

我的解决方案: 涉及的步骤

  1. 创建了一个界面RecyclerviewClickListener
  2. 在活动/片段上实现接口
  3. 将接口传递给适配器
  4. 在点击的项目上调用接口方法onBindViewHolder

RecyclerviewClickListener接口

   //Created an interface RecyclerviewClickListener
    public interface RecyclerviewClickListener
    {
        void recyclerviewClickListener(int position);
    }

新片段

//Implemented interface on an activity/fragment
public class NewFragment extends Fragment implements RecyclerviewClickListener
{
   //Passed the interface to the adapter
   adapter = new Adapter(getContext(), dataList, this);

    @Override
    public void recyclerviewClickListener(int position)
    {
      //Do something here with the position from a recyclerview
      //e.g dataList.get(position);
    }
}

适配器

public class UniversityAdapter extends RecyclerView.Adapter<UniversityAdapter.ViewHolder>
{
    private final ArrayList<User> dataList;
    private final Context context;
    private  RecyclerviewClickListener listener;

    public Adapter(Context context, ArrayList<User> dataList, RecyclerviewClickListener itemListener)
    {
        context = context;
        dataList = universityArrayList;
        listener = itemListener;
    }
    
        @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position)
    {
       holder.userName.setOnclickListener(view -> listener.recyclerviewClickListener(position));

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多