简体   繁体   English

Recyclerview触摸事件

[英]Recyclerview touch events

This is the first time I am working with RecyclerView , I have made Adapter class with some static mock data. 这是我第一次使用RecyclerView ,使Adapter类具有一些静态模拟数据。

public static class ViewHolder extends RecyclerView.ViewHolder{

        public TextView textView;

        public ViewHolder(View view){

            super(view);

            textView = (TextView)view.findViewById(R.id.MyTextView);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        view1 = LayoutInflater.from(context).inflate(R.layout.item, parent ,false);

        Toast.makeText(context, "@@@@@@@@@@@@" +viewType, Toast.LENGTH_SHORT).show();

        viewHolder1 = new ViewHolder(view1);

        return viewHolder1;
    }

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

        holder.textView.setText(SubjectValues[position]);
    }

    @Override
    public int getItemCount() {
        return SubjectValues.length;
    }
}

this is my Adapter clas now it's showing the mock data I want to achieve the click event. 这是我的Adapter现在它显示了我想要实现click事件的模拟数据。

In Adapter class, inside onBindViewHolder() method, you can register listener to the whole row as the following : 在Adapter类的onBindViewHolder()方法中,可以将侦听器注册到整个行,如下所示:

vh1.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
                Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show();
            }
        });

If you want to register listener to a specific view inside a row layout, you can do it as the following : 如果要在行布局内将侦听器注册到特定视图,则可以按照以下步骤进行操作:

vh1.getButton().setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
        Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show();
    }
});

The whole source code for the adapter class : 适配器类的整个源代码:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    switch (viewHolder.getItemViewType()) {
        case USER:
            ViewHolder1 vh1 = (ViewHolder1) viewHolder;
            configureViewHolder1(vh1, position);
            break;
    }
}

private void configureViewHolder1(ViewHolder1 vh1, int position) {
    User user = (User) items.get(position);
    if (user != null) {
        vh1.getLabel1().setText("Name: " + user.name);
        vh1.getLabel2().setText("Hometown: " + user.hometown);

        vh1.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
                Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show();
            }
        });
        vh1.getButton().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
                Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

ViewHolder1.java ViewHolder1.java

public class ViewHolder1 extends RecyclerView.ViewHolder {

    private TextView label1, label2;

    private Button button;

    public ViewHolder1(View v) {
        super(v);
        ...
        button = (Button) v.findViewById(R.id.button);
    }

    public Button getButton() {
        return button;
    }

    public void setButton(Button button) {
        this.button = button;
    }
}

Inside your onBindViewHolder set OnClickListener 在您的onBindViewHolder内部设置OnClickListener

@Override
    public void onBindViewHolder(final HomeListAdapter.MainViewHolder homeViewHolder, final int position) {

        homeViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(this, "Item no: "+ position, LENGTH_SHORT).show;
            }
        });
}

Using this way will make items layout clickable not only a textview or button. 使用这种方式将使项目布局不仅可以单击文本视图或按钮,还可以单击。 If perticularly you want to give action on click of button or textveiew then you can use reference of those components eg holder.button.setOnClickListener(new OnClick..)...... 如果您特别想在单击按钮或文本窗口时采取措施,则可以使用这些组件的引用,例如holder.button.setOnClickListener(new OnClick ..)......

To add a click event add the following into the onBindViewHolder method: 要添加点击事件,请将以下内容添加到onBindViewHolder方法中:

holder.textView.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    int adapterPos = holder.getAdapterPosition();
                    if(adapterPos != RecyclerView.NO_POSITION) {
                        Toast.makeText(context, SubjectValues[adapterPos], Toast.LENGTH_SHORT).show();
                    }
            }
        });

That would add a click listener to the textView which shows a toast of the value. 这会将一个单击侦听器添加到显示该值的textView。
Note: I have made assumptions on what your SubjectValues is, as not included in your question. 注意:我对您的SubjectValues是什么进行了假设,这没有包含在您的问题中。

But the important things to observe here are: 但是要注意的重要事项是:

  • holder.getAdapterPosition() holder.getAdapterPosition()
  • Check position (!= RecyclerView.NO_POSITION) 检查位置(!= RecyclerView.NO_POSITION)
  • Set this in onBindViewHolder 在onBindViewHolder中设置

I believe this is a fair summary of how to set a click listener within a recyclerview adapter. 我相信这是有关如何在recyclerview适配器中设置点击侦听器的合理总结。

add this class to your project 将此课程添加到您的项目中

public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}

public interface OnItemClickListener {
    void onItemClick(View view, int position);
}}

then in your RecyclerView use this 然后在您的RecyclerView中使用此

    myRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            YourModel model = modelList.get(position);
      }
    }));

Add OnItemClickListener interface into your adapter. OnItemClickListener接口添加到您的适配器中。

OnItemClickListener mItemClickListener;

public interface OnItemClickListener {
    public void onItemClick(View view, int position);
}

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

Implements OnItemClickListener on ViewHolder like below. 实现OnItemClickListenerViewHolder像下面。

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView textView;

    public ViewHolder(View view){
        super(view);
        textView = (TextView)view.findViewById(R.id.MyTextView);
        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(v, getAdapterPosition());
        }
    }       
}

In your Activity or Fragment setOnItemClickListener on your adapter. 在适配器上的Activity或Fragment setOnItemClickListener

 mAdapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
          // Do your stuff here when item clicked
        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM