OnBindViewHolder出错

时间:2018-01-23 15:57:02

标签: android recycler-adapter

我正在创建简单的屏幕,其中包含一个textview和按钮,使用Recyclerview和Cardview。 Xml代码已准备好但我不知道在我的适配器中的O​​nBindViewHolder类中要写什么。

这是我的RecycleView适配器

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

    private List<String> papers;
    public TextView paperName;


    public PaperAdapter(List<String> papers) {
        this.papers = papers;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{


        public MyViewHolder(View itemView) {
            super(itemView);
            paperName = itemView.findViewById(R.id.tvPaperName);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View paperView = layoutInflater.inflate(R.layout.paper_row, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(paperView);
        return myViewHolder;
    }

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

    }

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

这是我的MainActivity

 public class MainActivity extends AppCompatActivity {

                        RecyclerView recyclerView;

                        List<String> papers = new ArrayList<>();

                        @Override
                        protected void onCreate(@Nullable Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                setContentView(R.layout.activity_paper);

                                papers.add("Paper 1");
                                papers.add("Paper 2");
                                papers.add("Paper 3");
                                papers.add("Paper 4");

                                recyclerView = findViewById(R.id.rvPapers);
                                recyclerView.setLayoutManager(new LinearLayoutManager(this));
                                PaperAdapter adapter = new PaperAdapter(papers);
                                recyclerView.setAdapter(adapter);

                        }

                }

这是我的Pagelayout xml

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="4dp"
        app:cardElevation="5dp"
        app:cardBackgroundColor="#A4C639"
        app:cardUseCompatPadding="true"
        >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10dp"
            >

            <TextView
                android:id="@+id/tvPaperName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:text="paper 1"
                android:textColor="#000000"
                android:textSize="20sp"/>

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:text="download" />

        </RelativeLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

App没有在OnBindViewHolder上写任何东西,但它没有像这个列表那样显示Paper1,Paper2,Paper3,这就是为什么我需要在OnBindViewHolder中定义textview但它显示错误。请让我知道如何定义textview在那和什么写在OnBindViewHolder.Also想设置OnCLickListner按钮所以帮助我。谢谢你

1 个答案:

答案 0 :(得分:1)

  onBindViewHolder(ViewHolder, int)调用

RecyclerView以显示指定位置的数据。此方法应更新RecyclerView.ViewHolder.itemView的内容以反映给定位置的项目。

因此,您需要使用此方法更新itemView的内容以反映给定位置的项目。
根据您的问题,您希望在TextView中显示Button RecyclerView,因此您需要将onBindViewHolder()实施为:

@Override
    public void onBindViewHolder( RecyclerView.ViewHolder holder, int position) {
        holder.paperName.setText(papers.get(position));
        holder.download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // TODO: Your code to download
            }
        });
    }

您还需要将id提供给button as:

<Button
     android:id="@+id/btnDownload"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentEnd="true"
     android:layout_alignParentRight="true"
     android:layout_alignParentTop="true"
     android:text="download" />

并将MyViewHolder更新为:

public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView paperName;
        Button download;

        public MyViewHolder(View itemView) {
            super(itemView);
            paperName = itemView.findViewById(R.id.tvPaperName);
            download = itemView.findViewById(R.id.btnDownload);
        }
    }

只需将此代码复制并粘贴到PageAdapter课程中:

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

    private List<String> papers;
    private Context mContext;

    public PaperAdapter(Context context, List<String> papers) {
        this.papers = papers;
        this.mContext = context;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView paperName;
        Button download;

        public MyViewHolder(View itemView) {
            super(itemView);
            paperName = itemView.findViewById(R.id.tvPaperName);
            download = itemView.findViewById(R.id.btnDownload);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View paperView = layoutInflater.inflate(R.layout.paper_row, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(paperView);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder( RecyclerView.ViewHolder holder, int position) {
        holder.paperName.setText(papers.get(position));
        holder.download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext, papers.get(position), Toast.LENGTH_SHORT).show();
                // TODO: Your code to download
            }
        });
    }

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

编辑:您需要Context才能显示Toast,因此请将Context中的MainActivity传递为:

PaperAdapter adapter = new PaperAdapter(this, papers);