[英]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;
不檢查viewType
在onBindViewHolder
。 而是檢查持有人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或不是,我不確定您設置資源的方式是否好。
請通過此鏈接,它可能會幫助具有多個視圖類型(多個視圖持有者)的Android RecyclerView
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.