Android RecyclerView适配器中的onClickListener?
我想在我的RecyclerView适配器中设置一个onClickListener,这样我就可以轻松地引用其他视图来检索它们的标记 是否可以在RecyclerView适配器中设置onClickListener?我该怎么做?它会影响性能吗 这是我的RecyclerView适配器:Android RecyclerView适配器中的onClickListener?,android,android-intent,android-activity,android-recyclerview,Android,Android Intent,Android Activity,Android Recyclerview,我想在我的RecyclerView适配器中设置一个onClickListener,这样我就可以轻松地引用其他视图来检索它们的标记 是否可以在RecyclerView适配器中设置onClickListener?我该怎么做?它会影响性能吗 这是我的RecyclerView适配器: public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.ViewHolder> { priv
public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.ViewHolder> {
private Context context;
private List<Post> mDataset;
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
public LinearLayout mainLayout;
public TextView username;
public ImageView image;
public ViewHolder(LinearLayout view) {
super(view);
view.setOnCreateContextMenuListener(this);
mainLayout = (LinearLayout) view.findViewById(R.id.main_view);
username = (TextView) view.findViewById(R.id.username);
image = (ImageView) view.findViewById(R.id.image);
}
}
public PostRecyclerAdapter(Context context, List<Post> myDataset) {
this.context = context;
this.mDataset = myDataset;
}
@Override
public PostRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_layout, parent, false);
ViewHolder vh = new ViewHolder((LinearLayout) view);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Post postItem = mDataset.get(position);
holder.username.setText(postItem.getUserame());
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
公共类PostRecyclerAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表数据集;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnCreateContextMenuListener{
公共线路布局主要布局;
公共文本视图用户名;
公众形象;
公共视图持有者(线性布局视图){
超级(视图);
view.setOnCreateContextMenuListener(此);
mainLayout=(LinearLayout)视图。findViewById(R.id.main\u视图);
username=(TextView)view.findViewById(R.id.username);
image=(ImageView)view.findviewbyd(R.id.image);
}
}
公共PostRecyclerAdapter(上下文,列表myDataset){
this.context=上下文;
this.mDataset=myDataset;
}
@凌驾
public PostRecyclerAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.post_布局,parent,false);
ViewHolder vh=新的ViewHolder((线性布局)视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
Post positem=mDataset.get(位置);
holder.username.setText(positem.getUserName());
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}
您可以使用GestureDetector进行此操作。这很容易使用:
创建一个类RecyclerTouchListener:
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public interface ClickListener {
void onClick(View view, int position);
void onLongClick(View view, int position);
}
}
您可以按如下方式使用该类:
rvFilterOptions = (RecyclerView) rootView.findViewById(R.id.rvCommon);
rvFilterOptions.setHasFixedSize(true);
rvFilterOptions.addItemDecoration(new DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL_LIST));
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
rvFilterOptions.setLayoutManager(mLayoutManager);
rvFilterOptions.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), rvFilterOptions, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
// Perform click operation and you can get post item from array using position
}
@Override
public void onLongClick(View view, int position) {
// Perform Long click operation
}
}));
注:概念取自,我想建议一种比上述方法简单得多的方法。 在适配器中,您应该已经编写了静态视图持有者类,并添加了以下代码
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
// your views declared here
CardView cardView;
public ViewHolder(View itemView) {
super(itemView);
// your view initialised here
cardView=itemView.findViewById(R.id.card_view);
cardView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.card_view:
// your logic
break;
}
}
}
通过这样做,您可以处理布局的单个单击以及整个布局单击这是最简单的实现,但这将在recyclerviews适配器内部。若要在活动中获取行项目clicklistener,请使用界面
public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.ViewHolder> {
private Context context;
private List<Post> mDataset;
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
public LinearLayout mainLayout;
public TextView username;
public ImageView image;
public View mRowItem;
public ViewHolder(LinearLayout view) {
super(view);
view.setOnCreateContextMenuListener(this);
mRowItem = view;
mainLayout = (LinearLayout) view.findViewById(R.id.main_view);
username = (TextView) view.findViewById(R.id.username);
image = (ImageView) view.findViewById(R.id.image);
}
}
public PostRecyclerAdapter(Context context, List<Post> myDataset) {
this.context = context;
this.mDataset = myDataset;
}
@Override
public PostRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_layout, parent, false);
ViewHolder vh = new ViewHolder((LinearLayout) view);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Post postItem = mDataset.get(position);
holder.username.setText(postItem.getUserame());
//Whole row item
holder.mRowItem.setTag(position);
holder.mRowItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = (int) v.getTag();
// handle your row item click.
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
公共类PostRecyclerAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表数据集;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnCreateContextMenuListener{
公共线路布局主要布局;
公共文本视图用户名;
公众形象;
公众视野项目;
公共视图持有者(线性布局视图){
超级(视图);
view.setOnCreateContextMenuListener(此);
mRowItem=视图;
mainLayout=(LinearLayout)视图。findViewById(R.id.main\u视图);
username=(TextView)view.findViewById(R.id.username);
image=(ImageView)view.findviewbyd(R.id.image);
}
}
公共PostRecyclerAdapter(上下文,列表myDataset){
this.context=上下文;
this.mDataset=myDataset;
}
@凌驾
public PostRecyclerAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.post_布局,parent,false);
ViewHolder vh=新的ViewHolder((线性布局)视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
Post positem=mDataset.get(位置);
holder.username.setText(positem.getUserName());
//整行项目
holder.mRowItem.setTag(位置);
holder.mRowItem.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int pos=(int)v.getTag();
//单击以处理行项目。
}
});
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}
是否有必要使用GestureDetector彻底检修适配器,以便为视图获取一个简单的onClickListener事件?我想您忘记了设置listener