簡體   English   中英

具有多種視圖類型的Recyclerview

[英]Recyclerview with multiple view types

我創建了一個具有多種視圖類型的recyclerview。第一個問題是圖像不顯示,第二個問題是當我滾動recyclerview時,其項目的值發生了變化,我不知道如何解決它。 我的適配器代碼:

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

    private ArrayList<DataObject> mDataset;
    Context context;
    RecyclerView.ViewHolder viewHolder;


    public HeterogenousRecyclerviewAdapter(ArrayList<DataObject> myDataset) {
        this.mDataset = myDataset;
    }

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

    @Override
    public int getItemViewType(int position) {
        int view_type=mDataset.get(position).getView_type();
        return view_type;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        context=parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        switch (viewType){
            case 0:
                View v1 = inflater.inflate(R.layout.layout_viewholder1, parent, false);
                viewHolder = new ViewHolder1(v1);
                break;
            case 1:
                View v2 = inflater.inflate(R.layout.layout_viewholder2, parent, false);
                viewHolder = new ViewHolder2(v2);
                break;
        }

        return viewHolder;
    }

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

        switch (viewHolder.getItemViewType()){
            case 0:
                ViewHolder1 vh1 = (ViewHolder1) viewHolder;
                configureViewHolder1(vh1, position);
                break;
            case 1:
                ViewHolder2 vh2 = (ViewHolder2) viewHolder;
                configureViewHolder2(vh2, position);
                break;
        }

    }

    private void configureViewHolder1(ViewHolder1 vh1, int position) {
        if (mDataset != null) {
            vh1.getLabel1().setText(mDataset.get(position).getName());
            //vh1.getLabel2().setText("Hometown: " + user.hometown);
        }
    }

    private void configureViewHolder2(ViewHolder2 vh2, int position) {

        //vh2.getImageView().setImageResource(R.mipmap.img1);
        try {
            Resources res = context.getResources();
            int resourceId = res.getIdentifier(mDataset.get(position).getImg(), "mipmap",
                    context.getPackageName());
            vh2.getImageView().setImageResource(resourceId);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}

這是我的ViewHolder1類:

public class ViewHolder1 extends RecyclerView.ViewHolder {

    private TextView label1;

    public ViewHolder1(View v) {
        super(v);
        label1 = (TextView) v.findViewById(R.id.text1);
        //label2 = (TextView) v.findViewById(R.id.text2);
    }

    public TextView getLabel1() {
        return label1;
    }

    public void setLabel1(TextView label1) {
        this.label1 = label1;
    }

}

這是ViewHolder1.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="match_parent"
    android:orientation="vertical">


    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:textStyle="bold" />

</LinearLayout>

這是ViewHolder2類:

public class ViewHolder2 extends RecyclerView.ViewHolder {

    private ImageView ivExample;

    public ViewHolder2(View v) {
        super(v);
        ivExample = (ImageView) v.findViewById(R.id.ivExample);
    }

    public ImageView getImageView() {
        return ivExample;
    }

    public void setImageView(ImageView ivExample) {
        this.ivExample = ivExample;
    }
}

這是ViewHolder2.xml:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ivExample"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    android:layout_width="200dp"
    android:layout_height="200dp"/>

這是我的主要活動代碼:

        ArrayList<DataObject> personList = new ArrayList<DataObject>();
        DataObjectDBAdapter dataObjectDBAdapter = new     DataObjectDBAdapter(getApplicationContext());
        personList = dataObjectDBAdapter.getALL();
        adapter = new HeterogenousRecyclerviewAdapter(personList);

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(adapter);

某人可以幫助我嗎?

我沒有在SQLite數據庫中保存圖像的名稱,因此第一個問題是因為這個,第二個問題在我的適配器代碼中。 我必須在onBindViewHolder()編寫“ viewHolder”而不是“ holder”,因此正確的方法是:

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

    switch (viewHolder.getItemViewType()){
        case 0:
            ViewHolder1 vh1 = (ViewHolder1) viewHolder;
            configureViewHolder1(vh1, position);
            break;
        case 1:
            ViewHolder2 vh2 = (ViewHolder2) viewHolder;
            configureViewHolder2(vh2, position);
            break;
    }

}

首先確保給定的語句只能返回0或1,因為視圖類型必須以0開頭

int view_type=mDataset.get(position).getView_type();

無需將以下viewHolder創建為class的成員

RecyclerView.ViewHolder viewHolder;

不檢查viewTypeonBindViewHolder 而是檢查持有人instanceOf

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

        if(holder instanceOf ViewHolder1){
            (ViewHolder1) holder.getLabel1().setText(mDataset.get(position).getName());
        }
        else
        {
            try {
                Resources res = context.getResources();
                int resourceId = res.getIdentifier(mDataset.get(position).getImg(), "mipmap",
                    context.getPackageName());
                (ViewHolder2) holder.getImageView().setImageResource(resourceId);
            } catch (Exception e) {}
        }
    }

滾動后我有相同的問題值更改,然后我覆蓋了這些方法

@Override
public long getItemId(int position) {
    return position;
}

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

這解決了我的問題,並且對於Image heck,image resourceId為null或不是,我不確定您設置資源的方式是否好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM