简体   繁体   English

Android:RecyclerView Click Listener没有进入适配器

[英]Android: RecyclerView Click Listener is not getting in Adapter

I have an array of 600 items. 我有一个600项的数组。 I have put all the array items in a RecyclerView and they are scrolling well. 我已将所有数组项放在RecyclerView中,并且它们滚动得很好。 But, when I try to access onClick listener it is not getting called. 但是,当我尝试访问onClick监听器时,它没有被调用。 I also tried to Implement View.OnClickListener and Override onClick in my ViewHolder class, but its not working. 我还尝试在我的ViewHolder类中实现View.OnClickListener和Override onClick,但它无法正常工作。

I want to Toast data of the clicked item in the list when user clicks one of the items in the view 当用户单击视图中的某个项目时,我想要对列表中单击的项目的Toast数据进行Toast

Adapter code is 适配器代码是

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

public static class ViewHolder extends RecyclerView.ViewHolder
    implements View.OnClickListener {
private String mItem;
private TextView mTextView;

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

public void setItem(String item) {
    mItem = item;
    mTextView.setText(item);
}

@Override
public void onClick(View view) {
    Log.d("TAG", "onClick " + getPosition() + " " + mItem);
}
}

 private String[] mDataset;

 public MyAdapter(String[] dataset) {
  mDataset = dataset;
}

@Override
 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
  }

@Override
 public void onBindViewHolder(ViewHolder holder, int position) {
  holder.setItem(mDataset[position]);
  }

@Override
public int getItemCount() {
 return mDataset.length;
 }
}
Try this..

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

  public static class ViewHolder extends RecyclerView.ViewHolder
           {
    private String mItem;
    private TextView mTextView;

    public ViewHolder(View view) {
      super(view);
      mTextView = (TextView) view.findViewById(R.id.item_title);


    }

    public void setItem(String item) {
      mItem = item;
      mTextView.setText(item);
    }

    private String[] mDataset;
Context context;
    public MyAdapter(Context context,String[] dataset) {
    this.context=context;
      mDataset = dataset;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View v = LayoutInflater.from(parent.getContext())
              .inflate(R.layout.item, parent, false);
      ViewHolder vh = new ViewHolder(v);
      return vh;
    }

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

    holder.setOnClickListener(new ItemClicklistener(position);
      holder.setItem(mDataset[position]);
    }

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


      class ItemClicklistener implements View.OnClickListener {
        private  int position;

        ItemClicklistener(int position) {

            this.position = position;
        }

        @Override
        public void onClick(View view) {
           Toast.makeText(context,"OnClick :"+position,Toast.LENGTH_SHORT).show();


        }
    }


  }
        public class MyAdapter extends RecyclerView.Adapter {
            private final int VIEW_ITEM = 1;
            private final int VIEW_PROG = 0;
            private List<MyModel> list; 
            View v1;
            RecyclerView.ViewHolder vh;

            public MyAdapter(List<MyModel> lists) {
                list = lists;

            }

            @Override
            public int getItemViewType(int position) {
                return list.get(position) != null ? VIEW_ITEM : VIEW_PROG;
            }

            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                              int viewType) {
                if (viewType == VIEW_ITEM) {

                    v1 = LayoutInflater.from(parent.getContext()).inflate(
                            R.layout.item, parent, false);
                    vh = new MyViewHolder(v1);
                    return vh;
                }
            }


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

                if (holder instanceof MyViewHolder) {

                   final MyModel mymodel= (MyModel) list.get(position);

                    ((MyViewHolder) holder).mTextView.setText(mymodel.getItem());

                    ((MyViewHolder) holder).mTextView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {

                             Log.d("TAG", "onClick " + Integer.toString(position) + " " + mymodel.getItem());
                        }
                    });

                }

            }

            @Override
            public int getItemCount() {
                return list.size();
            }


            public static class MyViewHolder extends RecyclerView.ViewHolder {

                public TextView;

                public MyViewHolder(View view) {
                    super(view);
                     mTextView = (TextView) view.findViewById(R.id.item_title);
                }
            }


        }


    // List Item Stored


    public class MyModel extends Application implements Serializable {

        private static final long serialVersionUID = 1L;

        private String item,

        public MyModel() {}

        public MyModel(String itemtext) {
            this.item = itemtext;
        }

        public String getItem() {return  item;}

        public void setItem(String id){ this.item = item;}


    }



//use this code in main activity

List<MyModel> Listitem = new ArrayList<CarListGetterSetter>();
for(int i=0;i<600;i++){
Listitem.add(new MyModel("hi"+i);
}

 RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
 recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
 MyAdapter mAdapter = new MyAdapter(Listitem);
 recyclerView.setAdapter(mAdapter);

You can implement your RecyclerView adapter this way to support for onItemCLick and OnItemLongClick 您可以通过这种方式实现RecyclerView适配器,以支持onItemCLick和OnItemLongClick

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

ArrayList<Person> data;
Context context;
HashMap<String, Integer> screenDetails;


private static ClickListener clickListener;

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

public void setOnItemClickListener(ClickListener clickListener) {
    PersonAdapter.clickListener = clickListener;
}

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

    TextView full_name;


    public ViewHolder(View v) {
        super(v);
        view = v;

        full_name = (TextView)view.findViewById(R.id.first_name);

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

    @Override
    public void onClick(View v) {
        clickListener.onItemClick(getAdapterPosition(), v);
    }

    @Override
    public boolean onLongClick(View v) {
        clickListener.onItemLongClick(getAdapterPosition(), v);
        return false;
    }
}


public PersonAdapter(Context context, ArrayList<Person> data) {
    this.context = context;
    this.data = data;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View cardView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_chatroom_item, parent, false);
    return new ViewHolder(cardView);
}

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

    final Person person = data.get(position);


}

@Override
public int getItemCount() {
    return data.size();
}


}

And in your activity implement it this way 在你的活动中以这种方式实现它

PersonAdapter personAdapter = new PersonAdapter(getApplicationContext(),persons);
    personAdapter.setOnItemClickListener(new PersonAdapter.ClickListener() {
        @Override
        public void onItemClick(int position, View v) {

        }

        @Override
        public void onItemLongClick(int position, View v) {

        }
    });
recyclerView.setAdapter(PersonAdapter);

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

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