使用recycleler-android使用Long Click Listener

var*_*nju 10 android android-recyclerview

我正在开发像Android应用程序项目的notapad.我已经实施了回收商.我的项目包含NotedAdaper类,该类RecyclerView.Adapter<NotesAdapter.ViewHolder>
在该类中使用以下代码扩展,我使用了单击侦听器,

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

private List<Notes> mNotes;
private Context mContext;

public NotesAdapter(Context context, List<Notes> notes) {
    mNotes = notes;
    mContext = context;
}


@Override
public NotesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    // Inflate the custom layout
    View notesView = inflater.inflate(R.layout.items_notes, parent, false);

    // Return a new holder instance
    ViewHolder viewHolder = new ViewHolder(notesView);
    return viewHolder;
}


// Easy access to the context object in the recyclerview
private Context getContext() {
    return mContext;
}

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

    // Get the data model based on position
    Notes notes = mNotes.get(position);

    // Set item views based on your views and data model
    TextView textView = viewHolder.preTitle;
    textView.setText(notes.getTitle());
    TextView textView1 = viewHolder.preText;
    textView1.setText(notes.getText());
    String color=notes.getColor();

    CardView preCard=viewHolder.preCard;
    preCard.setBackgroundColor(Color.parseColor(color));
    ImageView img = viewHolder.preImage;
    img.setVisibility(View.GONE);

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Notes notes = mNotes.get(position);
            Intent intent = new Intent(view.getContext(),EditNote.class);

            Bundle bundle = new Bundle();
            bundle.putSerializable("DATA",notes);
            intent.putExtras(bundle);
            getContext().startActivity(intent);

            Toast.makeText(getContext(), "Recycle Click" + position+"  ", Toast.LENGTH_SHORT).show();
        }
    });
}

// Returns the total count of items in the list
@Override
public int getItemCount() {
    return mNotes.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    // Your holder should contain a member variable
    // for any view that will be set as you render a row
    public RobotoTextView preTitle, preText;
    public ImageView preImage;
    public CardView preCard;

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

        preTitle = (RobotoTextView) itemView.findViewById(R.id.preTitle);
        preText = (RobotoTextView) itemView.findViewById(R.id.preText);
        preImage=(ImageView) itemView.findViewById(R.id.preImage);
        preCard=(CardView) itemView.findViewById(R.id.preCard);

    }
}}   
Run Code Online (Sandbox Code Playgroud)

它绝对有效.在单击Recycler中的项目时,它使用该项目的位置检索数据.并在另一项活动中展示.就像,假设一个活动显示用户创建的笔记列表.并单击任何注释,它会显示该注释的完整内容.

但现在我想在项目上实现Long click监听器.并得到这个位置.所以,我使用以下代码......

viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Notes notes = mNotes.get(position);
                Toast.makeText(getContext(), "long Click" + position+"  ", Toast.LENGTH_SHORT).show();
                return false;
            }
        });  
Run Code Online (Sandbox Code Playgroud)

所以,它也有效.但我想要的是,长按一下,它应该只显示Toast.但它不仅显示长按烤面包.但是还要识别点击监听器并在显示toast >>"长按:..."后执行为单击事件编写的代码.你不想要它.两个听众都应该分开工作.但为什么它长时间点击后执行单击??? 任何的想法???
我在哪里弄错了?

var*_*nju 22

所以,我的代码中的以下更改,帮助我实现我的输出.1)每次将视图与数据绑定时,都会调用onBindViewHolder方法.所以没有设置点击监听器的最佳位置.您不必为一个View多次设置OnClickListener.这就是为什么,我在ViewHolder中编写了点击监听器,(实际上这不是我的问题,但我在某处读到这将是最好的做法,这就是为什么我要关注它)

像这样,

public static class ViewHolder extends RecyclerView.ViewHolder {
        // Your holder should contain a member variable
        // for any view that will be set as you render a row
        public ImageView preImage;
        public CardView preCard;

        // We also create a constructor that accepts the entire item row
        // and does the view lookups to find each subview
        public ViewHolder(final View itemView) {
            // Stores the itemView in a public final member variable that can be used
            // to access the context from any ViewHolder instance.
            super(itemView);
            itemView.findViewById(R.id.preTitle);
            preImage=(ImageView) itemView.findViewById(R.id.preImage);
            preCard=(CardView) itemView.findViewById(R.id.preCard);


            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    int p=getLayoutPosition();
                    System.out.println("LongClick: "+p);
                    return true;// returning true instead of false, works for me
                }
            });

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   int p=getLayoutPosition();

                   Notes notes = mNotes.get(p);     
                   Toast.makeText(getContext(), "Recycle Click" + p +"  ", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }  
Run Code Online (Sandbox Code Playgroud)

您可能会注意到,在onLongClick中,我已经返回"true",默认情况下它是"false".这个改变对我有用.


小智 6

只是onLongClick(View v)退货return true而不是return false 解决我的问题它也应该解决你的问题