gpt4 book ai didi

android - 有没有什么简单的实现或者教程可以在android中实现RecyclerView?

转载 作者:行者123 更新时间:2023-11-29 01:34:44 28 4
gpt4 key购买 nike

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

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

我在以下方面苦苦挣扎,这是我通过阅读各种教程编写的:

  1. 适配器:我的适配器代码如下:

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

  3. 我仍然无法理解 OnClickListener。首先,我想要一个简单的 OnClickListener,就像 ListView.OnClickListener 一样。当前的 OnClickListener 是根据教程编译的,但不起作用。

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

最佳答案

RecyclerView Adapter Example:

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

    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 的底部添加下方 View 作为分隔线。

     <View
    android:layout_width="wrap_content"
    android:layout_height="0.5dip"
    android:background="@color/light_gray"/>
  2. 项目点击监听器也已在第 1 点中解决。 1 以上。

希望对您有所帮助。

关于android - 有没有什么简单的实现或者教程可以在android中实现RecyclerView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29051974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com