【问题标题】:RecyclerView Adapter: why does onLongClick method conflict with onClick?RecyclerView Adapter:为什么onLongClick方法和onClick冲突?
【发布时间】:2016-12-06 00:06:41
【问题描述】:

在我的 RecyclerView 的适配器文件中,我在 onCreateViewHolder 方法中设置了一个 OnClickListener。它工作正常,即在单击 RecyclerView 列表中的项目时启动新活动。我正在尝试为将运行不同方法的项目的 LongClick 添加 OnLongClickListener。

当我添加如下所示的 setOnLongClickListener 部分和 onLongClick 方法时,RecyclerView 列表中的项目无法正确显示,因此视图中的某些内容一定不正确。我在这里错过了什么?

适配器文件:

public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.ContactHolder>{

    private RecyclerItemClickListener recyclerItemClickListener;
    ...
    @Override
    public ContactHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);

    final ContactHolder contactHolder = new ContactHolder(view);

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

    contactHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            int adapterPos = contactHolder.getAdapterPosition();
            if (adapterPos != RecyclerView.NO_POSITION) {
                if (recyclerItemClickListener != null) {
                    recyclerItemClickListener.onItemLongClick(adapterPos, contactHolder.itemView);
                }
            }
            return false;
        }
    });

    return contactHolder;
}

public void setOnItemClickListener(RecyclerItemClickListener recyclerItemClickListener) {
    this.recyclerItemClickListener = recyclerItemClickListener;
}

监听文件:

public interface RecyclerItemClickListener {
    void onItemClick(int position, View view);
    void onItemLongClick(int position, View v);
}

活动文件:

...
@Override
public void onItemClick(int position, View view) {
    ActActivity.start(this, contactListAdapter.getItem(position));
}

@Override
public void onItemLongClick(int position, View v) {
    Toast toast = Toast.makeText(this, "Test", Toast.LENGTH_LONG);
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    toast.show();
}

【问题讨论】:

  • 你有没有在你的 recyclerview 上实现过 onItemTouchListener?如果有,请将其删除并重试。
  • 不,我没有使用任何 onItemTouchListener 代码。

标签: android onclick android-recyclerview


【解决方案1】:

在 bindViewHolder 方法中实现 onClickListener 和 onLongClickListener 或在定义的视图持有者类中选择实现它。它应该可以解决您的问题。

    public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

           public CustomViewHolder(View itemView) {
                super(itemView);

                itemView.setOnLongClickListener(this);
                itemView.setOnClickListener(this);
            }

            @Override
            public boolean onLongClick(View view) {

                int adapterPos = getAdapterPosition();
            if (adapterPos != RecyclerView.NO_POSITION) {
                if (recyclerItemClickListener != null) {
                    recyclerItemClickListener.onItemLongClick(adapterPos, contactHolder.itemView);
                }
            }
                return false;
            }

            @Override
            public void onClick(View view) {

               int adapterPos = getAdapterPosition();
            if (adapterPos != RecyclerView.NO_POSITION) {
                if (recyclerItemClickListener != null) {
                    recyclerItemClickListener.onItemClick(adapterPos, contactHolder.itemView);
                }
            }
                }
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多