RecyclerView onItemClick接口:获取适配器或活动中的值?

时间:2017-12-06 16:43:10

标签: android android-recyclerview

我有一个带有OnClickListener的ViewHolder,它通过接口将点击发送到底层的Activity。我发送的唯一信息是AdapterPosition。在Activity i中,然后使用从适配器传递的位置,从Activitie对ArrayList(也填充适配器)的引用中获取信息。然后我用它打开一个新的Activity,我显示这些数据。 现在,这可行,但我只是想到这可能会导致问题,如果我没有正确调用notifyDataSetChanged / ItemInserted / Removed等,并且适配器显示的活动列表与活动中的实际最新列表不同。我说得对吗?我应该从适配器中的对象中获取值并将它们传递给活动还是我的方法正确?

ViewHolder:

public class ExampleViewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView;
    public TextView mTextViewCreator;
    public TextView mTextViewLikes;

    public ExampleViewHolder(View itemView) {
        super(itemView);
        mImageView = itemView.findViewById(R.id.image_view);
        mTextViewCreator = itemView.findViewById(R.id.text_view_creator);
        mTextViewLikes = itemView.findViewById(R.id.text_view_likes);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        mListener.onItemClick(position);
                    }
                }
            }
        });
    }
}

MainActivity OnItemClick实现:

@Override
public void onItemClick(int position) {
    Intent detailIntent = new Intent(this, DetailActivity.class);
    ExampleItem clickedItem = mExampleList.get(position);

    detailIntent.putExtra("imageUrl", clickedItem.getImageUrl());
    detailIntent.putExtra("creatorName", clickedItem.getCreator());
    detailIntent.putExtra("likeCount", clickedItem.getLikeCount());

    startActivity(detailIntent);
}

2 个答案:

答案 0 :(得分:0)

答案很简单:始终确保通知适配器有关更改。 否则它的行为变得不可预测。

除此之外,你的代码似乎还不错

答案 1 :(得分:0)

我个人的偏好是,您将模型发送到活动,这是它感兴趣的内容,它不关心您的适配器位置,即使将来您的列表成为可扩展列表,甚至是{{1所有ViewPagerCallback)想要的是启动新屏幕的模型。

您可以将侦听器方法更改为

Activity

然后您可以在调用onItemClick(ExampleItem item) 时设置您的侦听器。