是否有任何简单的实现或教程可以在 android 中实现 RecyclerView? [英] Is there any simple implementation or tutorial to implement RecyclerView in android?

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

问题描述

我正在尝试将现有项目移植到 Material Design,但无法理解 RecyclerView 的实现.我的旧代码使用 ListView,但我想要像列表一样的 GMail 应用程序.

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.

我已经阅读了大量教程,但其中大部分要么跳过了ItemDecoration 部分或ClickListener 部分.不同的教程有完全不同的实现,代码也各不相同,以至于我无法理解该放在哪里.

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. 适配器:我的适配器代码如下:

  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);

}
}
}

  • ItemDecoration 是从这里复制的:https://gist.github.com/alexfu/0f464fc3742f134ccd1e.但是我真的需要这么大的类来在列表项之间放置简单的分隔符吗?如果我想自己实现代码怎么办?

  • 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?

    我仍然无法弄清楚 OnClickListener.首先,我想要一个简单的 OnClickListener,就像 ListView.OnClickListener.当前的 OnClickListener 是从教程编译的,但不起作用.

    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.

    完整代码在这里:https://github.com/pauldmps/MaterialDesign/

    推荐答案

    RecyclerView 适配器示例:

    1. 适配器问题可以使用以下代码解决:

    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);
    
    }
    
    }
    }
    

  • 用法如下:

    MyAdapter adapter=....;
    adapter.setClickListener(new ClickListener() {
    
            @Override
            public void onClick(View v, int pos) {
                // do whatever you want
            }
        });
    

    1. 没有任何简单的方法可以做到这一点.但我会建议你一个解决方法.在 list_item.xml 的底部添加下面的视图作为分隔线.

    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"/>
    

  • 项目点击监听器也在第 1 点解决.1 以上.

  • Item click listener is also resolved in point no. 1 above.

    希望对你有帮助.

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

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