Is there any simple implementation or tutorial to implement RecyclerView in android?

狂风中的少年 提交于 2019-12-17 21:32:42

问题


I am trying to port my existing project to material design but am unable to understand the implementation of RecyclerView. My old code uses a ListView but I want GMail app like lists.

I have read tons of tutorials but most of them either skip the ItemDecoration part or the ClickListener part. Different tutorials have entirely different implementations and code varies to the point that I am unable to understand where to put what.

I am struggling in the following, which I compiled by reading various tutorials:

  1. Adapter: My adapter code is the following:

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    
    private final Context mContext;
    private List<String> mData1, mData2;
    
    public MyAdapter(Context mContext, String[] data1,String[] data2) {
    this.mContext = mContext;
    if (data1 != null)
        mData1 = new ArrayList<String>(Arrays.asList(data1));
    else mData1 = new ArrayList<String>();
    
    if (data2 != null)
        mData2 = new ArrayList<String>(Arrays.asList(data2));
    else mData2 = new ArrayList<String>();
    }
    
    public void add(String s,int position) {
    position = position == -1 ? getItemCount()  : position;
    mData1.add(position,s);
    
    notifyItemInserted(position);
    }
    
    public void remove(int position){
    if (position < getItemCount()  ) {
        mData1.remove(position);
        notifyItemRemoved(position);
    }
    }
    
    
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
    View itemView = inflater.inflate(R.layout.list_item,viewGroup,false);
    
    return new MyViewHolder(itemView);
    }
    
    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int position) {
    myViewHolder.tv1.setText(mData1.get(position));
    myViewHolder.tv2.setText(mData2.get(position));
    
    myViewHolder.setClickListener(new MyViewHolder.ClickListener()
    {
    
         @Override
         public void onClick(View v, int pos) {
             Toast.makeText(mContext,"The selected position is: "+ pos,Toast.LENGTH_SHORT).show();
    
         }
      });
    
    
    
    
      }
    
      @Override
      public int getItemCount() {
      return mData1.size();
      }
    
      public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
    protected TextView tv1;
    protected TextView tv2;
    ClickListener clickListener;
    
    
    
    public MyViewHolder(View itemView) {
        super(itemView);
        tv1 = (TextView) itemView.findViewById(R.id.txt1);
        tv2 = (TextView) itemView.findViewById(R.id.txt2);
    
    
    }
    
    @Override
    public void onClick(View v) {
    
    }
    
    public void onClick(View v, int pos)
    {
        clickListener.onClick(v,getPosition());
    
    }
    
    public void setClickListener(ClickListener clickListener)
    {
        this.clickListener = clickListener;
    }
    
    
    public interface ClickListener
    {
        public void onClick(View v,int pos);
    
    }
    }
    }
    
  2. The ItemDecoration is copied from here: https://gist.github.com/alexfu/0f464fc3742f134ccd1e. But do I really need such a large class just to put simple dividers between list items? What if I wanted to implement the code on my own?

  3. I still cannot figure out the OnClickListener. For a start, the I want a simple OnClickListener just like ListView.OnClickListener. The current OnClickListener was compiled from a tutorial but does not work.

Full code here: https://github.com/pauldmps/MaterialDesign/


回答1:


RecyclerView Adapter Example:

  1. Adapter issue can be solved using below code:

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>         
    {
    
    private final Context mContext;
    private List<String> mData1, mData2;
    
    public MyAdapter(Context mContext, String[] data1, String[] data2) {
    this.mContext = mContext;
    if (data1 != null)
        mData1 = new ArrayList<String>(Arrays.asList(data1));
    else
        mData1 = new ArrayList<String>();
    
    if (data2 != null)
        mData2 = new ArrayList<String>(Arrays.asList(data2));
    else
        mData2 = new ArrayList<String>();
    }
    
    public void add(String s, int position) {
    position = position == -1 ? getItemCount() : position;
    mData1.add(position, s);
    
    notifyItemInserted(position);
    }
    
    public void remove(int position) {
    if (position < getItemCount()) {
        mData1.remove(position);
        notifyItemRemoved(position);
    }
    }
    
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
    View itemView = inflater.inflate(R.layout.list_item, viewGroup, false);
    
    return new MyViewHolder(itemView);
    }
    
    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, final int position) {
        myViewHolder.tv1.setText(mData1.get(position));
    myViewHolder.tv2.setText(mData2.get(position));
    myViewHolder.itemView.setOnClickListener(new OnClickListener() {
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            clickListener.onClick(v, position);
        }
    });
    }
    
    @Override
    public int getItemCount() {
    return mData1.size();
    }
    
    ClickListener clickListener;
    
    public void setClickListener(ClickListener clickListener) {
    this.clickListener = clickListener;
    }
    
    public interface ClickListener {
    public void onClick(View v, int pos);
    
    }
    
    public static class MyViewHolder extends RecyclerView.ViewHolder {
    protected TextView tv1;
    protected TextView tv2;
    
    public MyViewHolder(View itemView) {
        super(itemView);
        tv1 = (TextView) itemView.findViewById(R.id.txt1);
        tv2 = (TextView) itemView.findViewById(R.id.txt2);
    
    }
    
    }
    }
    

Usage is as below:

MyAdapter adapter=....;
adapter.setClickListener(new ClickListener() {

        @Override
        public void onClick(View v, int pos) {
            // do whatever you want
        }
    });
  1. There is not any Simple way to do that. But i would suggest you one workaround for this. Add below view as a divider at the bottom inside your list_item.xml.

     <View
    android:layout_width="wrap_content"
    android:layout_height="0.5dip" 
    android:background="@color/light_gray"/>
    
  2. Item click listener is also resolved in point no. 1 above.

I hope this would help you.




回答2:


Here is example for Simple Implementation of RecyclerView using a Simple Library

Add this line in build.gradle

implementation 'com.hereshem.lib:awesomelib:2.0.1'

Create RecyclerView Layout in Activity with

<com.hereshem.lib.recycler.MyRecyclerView
        android:id="@+id/recycler"
        app:layoutManager="LinearLayoutManager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Create a ViewHolder by passing the class it suppports

public static class EVHolder extends MyViewHolder<Events> {
    TextView date, title, summary;
    public EVHolder(View v) {
        super(v);
        date = v.findViewById(R.id.date);
        title = v.findViewById(R.id.title);
        summary = v.findViewById(R.id.summary);
    }
    @Override
    public void bindView(Events c) {
        date.setText(c.date);
        title.setText(c.title);
        summary.setText(c.summary);
    }
}

Create Items List variable and adapters with very few lines

List<Events> items = new ArrayList<>();
MyRecyclerView recycler = findViewById(R.id.recycler);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, items, EVHolder.class, R.layout.row_event);
recycler.setAdapter(adapter);

ClickListener can be added with folllowing line

recycler.setOnItemClickListener(new MyRecyclerView.OnItemClickListener() {
    @Override
    public void onItemClick(int position) {
        Toast.makeText(MainActivity.this, "Recycler Item Clicked " + position, Toast.LENGTH_SHORT).show();
    }
});

More example can be found here

Hope this helps :)



来源:https://stackoverflow.com/questions/29051974/is-there-any-simple-implementation-or-tutorial-to-implement-recyclerview-in-andr

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