有没有简单的实现或教程在Android中实现RecyclerView? [英] Is there any simple implementation or tutorial to implement RecyclerView in android?

查看:136
本文介绍了有没有简单的实现或教程在Android中实现RecyclerView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想端口我现有的项目材料设计,但我无法理解RecyclerView实施。我的老code使用一个ListView,但我希望Gmail应用程序,如列表。

我看了吨教程,但大多要么跳过 ItemDecoration 部分或 ClickListener 部分。不同的教程有完全不同的实现和code各不相同,我无法点到明白的地方放什么。

我挣扎在下面,我通过阅读各种教程编译:

  1. 适配器:我的适配器code是如下:

     公共类MyAdapter扩展RecyclerView.Adapter< MyAdapter.MyViewHolder> {
    
    私人最终语境mContext;
    私人列表<字符串> mData1,mData2;
    
    公共MyAdapter(上下文mContext,的String []数据1,的String []数据2){
    this.mContext = mContext;
    如果(数据1!= NULL)
        mData1 =新的ArrayList<字符串>(Arrays.asList(数据1));
    否则mData1 =新的ArrayList<字符串>();
    
    如果(数据2!= NULL)
        mData2 =新的ArrayList<字符串>(Arrays.asList(数据2));
    否则mData2 =新的ArrayList<字符串>();
    }
    
    公共无效添加(字符串S,INT位置){
    位置=位置== -1? getItemCount():位置;
    mData1.add(位置,多个);
    
    notifyItemInserted(位置);
    }
    
    公共无效删除(INT位置){
    如果(位置< getItemCount()){
        mData1.remove(位置);
        notifyItemRemoved(位置);
    }
    }
    
    
    @覆盖
    公共MyViewHolder onCreateViewHolder(ViewGroup中的ViewGroup,int i)以{
    LayoutInflater充气= LayoutInflater.from(viewGroup.getContext());
    查看ItemView控件= inflater.inflate(R.layout.list_item,ViewGroup中,假);
    
    返回新MyViewHolder(ItemView控件);
    }
    
    @覆盖
    公共无效onBindViewHolder(MyViewHolder myViewHolder,INT位置){
    myViewHolder.tv1.setText(mData1.get(位置));
    myViewHolder.tv2.setText(mData2.get(位置));
    
    myViewHolder.setClickListener(新MyViewHolder.ClickListener()
    {
    
         @覆盖
         公共无效的onClick(视图V,INT POS){
             Toast.makeText(mContext,所选的立场是:+ POS,Toast.LENGTH_SHORT).show();
    
         }
      });
    
    
    
    
      }
    
      @覆盖
      公众诠释getItemCount(){
      返回mData1.size();
      }
    
      公共静态类MyViewHolder扩展RecyclerView.ViewHolder实现View.OnClickListener
    {
    受保护的TextView TV1;
    受保护的TextView TV2;
    ClickListener clickListener;
    
    
    
    公共MyViewHolder(查看ItemView控件){
        超(ItemView控件);
        TV1 =(TextView中)itemView.findViewById(R.id.txt1);
        TV2 =(TextView中)itemView.findViewById(R.id.txt2);
    
    
    }
    
    @覆盖
    公共无效的onClick(视图v){
    
    }
    
    公共无效的onClick(视图V,INT POS)
    {
        clickListener.onClick(ⅴ为getPosition());
    
    }
    
    公共无效setClickListener(ClickListener clickListener)
    {
        this.clickListener = clickListener;
    }
    
    
    公共接口ClickListener
    {
        公共无效的onClick(视图V,INT POS);
    
    }
    }
    }
     

  2. ItemDecoration 从这里被复制: https://gist.github.com/alexfu/0f464fc3742f134ccd1e 。但我真的需要这么大的类只是把简单的除法器列表项之间?如果我想要实现我自己的code?

  3. 我仍然无法找出 OnClickListener 。首先,在我想要一个简单的 OnClickListener 就像 ListView.OnClickListener 。目前 OnClickListener 从一个教程编译,但不起作用。

全部code在这里: https://github.com/pauldmps/MaterialDesign/

解决方案
  

RecyclerView适配器范例:

  1. 适配器问题,可以使用下面code来解决:

     公共类MyAdapter扩展RecyclerView.Adapter< MyAdapter.MyViewHolder>
    {
    
    私人最终语境mContext;
    私人列表<字符串> mData1,mData2;
    
    公共MyAdapter(上下文mContext,的String []数据1,的String []数据2){
    this.mContext = mContext;
    如果(数据1!= NULL)
        mData1 =新的ArrayList<字符串>(Arrays.asList(数据1));
    其他
        mData1 =新的ArrayList<字符串>();
    
    如果(数据2!= NULL)
        mData2 =新的ArrayList<字符串>(Arrays.asList(数据2));
    其他
        mData2 =新的ArrayList<字符串>();
    }
    
    公共无效添加(字符串S,INT位置){
    位置=位置== -1? getItemCount():位置;
    mData1.add(位置,多个);
    
    notifyItemInserted(位置);
    }
    
    公共无效删除(INT位置){
    如果(位置< getItemCount()){
        mData1.remove(位置);
        notifyItemRemoved(位置);
    }
    }
    
    @覆盖
    公共MyViewHolder onCreateViewHolder(ViewGroup中的ViewGroup,int i)以{
    LayoutInflater充气= LayoutInflater.from(viewGroup.getContext());
    查看ItemView控件= inflater.inflate(R.layout.list_item,ViewGroup中,假);
    
    返回新MyViewHolder(ItemView控件);
    }
    
    @覆盖
    公共无效onBindViewHolder(MyViewHolder myViewHolder,最终诠释位置){
        myViewHolder.tv1.setText(mData1.get(位置));
    myViewHolder.tv2.setText(mData2.get(位置));
    myViewHolder.itemView.setOnClickListener(新OnClickListener(){
    
        @覆盖
        公共无效的onClick(视图v){
            // TODO自动生成方法存根
            clickListener.onClick(V,位置);
        }
    });
    }
    
    @覆盖
    公众诠释getItemCount(){
    返回mData1.size();
    }
    
    ClickListener clickListener;
    
    公共无效setClickListener(ClickListener clickListener){
    this.clickListener = clickListener;
    }
    
    公共接口ClickListener {
    公共无效的onClick(视图V,INT POS);
    
    }
    
    公共静态类MyViewHolder扩展RecyclerView.ViewHolder {
    受保护的TextView TV1;
    受保护的TextView TV2;
    
    公共MyViewHolder(查看ItemView控件){
        超(ItemView控件);
        TV1 =(TextView中)itemView.findViewById(R.id.txt1);
        TV2 =(TextView中)itemView.findViewById(R.id.txt2);
    
    }
    
    }
    }
     

用法如下:

  MyAdapter适配器= ....;
adapter.setClickListener(新ClickListener(){

        @覆盖
        公共无效的onClick(视图V,INT POS){
            // 做你想做的
        }
    });
 

<醇开始=2>

  • 没有任何简单的方法来做到这一点。但我建议你一次解决此。下面添加视图作为分压器内的底部你的 list_item.xml

     &LT;查看
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =0.5dip
    机器人:背景=@色/ light_gray/&GT;
     

  • 项目点击监听器也解决了点没有。上述1。

  • 我希望这会帮助你。

    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/

    解决方案

    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.

    这篇关于有没有简单的实现或教程在Android中实现RecyclerView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆