RecyclerView Adapter: why does onLongClick method conflict with onClick?

。_饼干妹妹 提交于 2021-01-29 05:46:56

问题


In my RecyclerView's adapter file I have an OnClickListener set in the onCreateViewHolder method. It is working correctly, which is to launch a new activity when an item in the RecyclerView list is clicked on. I am trying to add an OnLongClickListener for a LongClick on the item that will run a different method.

When I add the setOnLongClickListener section and onLongClick method shown below, then the items in the RecyclerView list don't show properly so something with the views must not be correct. What am I missing here?

Adapter file:

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;
}

Listener file:

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

Activity file:

...
@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();
}

回答1:


Implement onClickListener and onLongClickListener inside bindViewHolder method or optionally implement it in view holder class defined. It should solve your issue.

    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);
                }
            }
                }
            }
        }


来源:https://stackoverflow.com/questions/38689881/recyclerview-adapter-why-does-onlongclick-method-conflict-with-onclick

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!