使用 onbindviewholder 在 cardview 中填充线性布局
Populating a linearlayout within cardview using onbindviewholder
我的 cardview 中有一个线性布局,而 cardview 又位于 recyclerview 中。我试图通过数组列表动态地将数据填充到线性布局中——其中 cardview 的每个线性布局中的元素数量将具有不同的大小。当我执行以下操作时,每次我将其滚动出视图时都会调用 onBindViewHolder,一次又一次地将元素添加到线性布局中。这是回收站视图的适配器。请告诉我如何以正确的方式添加这些元素,这样线性布局就不会过多。
public class CardRecyclerAdapter extends RecyclerView.Adapter<CardRecyclerAdapter.DataObjectHolder> {
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<ElementCard> cardElements;
private static MyClickListener myClickListener;
private Context context;
public static class DataObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView title;
LinearLayout listView;
RelativeLayout relativeLayout;
public DataObjectHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.card_title);
listView = (LinearLayout) itemView.findViewById(R.id.card_listview);
relativeLayout = (RelativeLayout) itemView.findViewById(R.id.card_rellay);
Log.i(LOG_TAG, "Adding Listener");
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
myClickListener.onItemClick(getAdapterPosition(), v);
}
}
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
public CardRecyclerAdapter(ArrayList<ElementCard> myDataset, Context context) {
cardElements = myDataset;
this.context = context;
}
@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.element_card, parent, false);
DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;
}
@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
holder.title.setText(cardElements.get(position).mTransactions.get(0).tCategory);
for (Transaction transaction : cardElements.get(position).mTransactions) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.element_listitem, null, false);
CheckBox checkBox = (CheckBox) view.findViewById(R.id.listitem_checkBox);
checkBox.setText(transaction.tSentence); // set sentence for now -> change later
checkBox.setChecked(transaction.tCompleted); // set checkbox completed or not
holder.listView.addView(view);
}
}
public void addItem(ElementCard dataObj, int index) {
cardElements.add(index, dataObj);
notifyItemInserted(index);
}
public void deleteItem(int index) {
cardElements.remove(index);
notifyItemRemoved(index);
}
@Override
public int getItemCount() {
return cardElements.size();
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
public interface MyClickListener {
public void onItemClick(int position, View v);
}
}
视图在滚动时会被回收,所以LinearLayout中仍然会包含之前绑定添加的子视图。您可以在 LinearLayout 上使用以下代码清除所有视图(只需将视图 ID 替换为您在项目中使用的内容):
LinearLayout myLinearLayout = (LinearLayout) cardView.findViewById(R.id.my_linear_layout);
myLinearLayout.removeAllViews();
我的 cardview 中有一个线性布局,而 cardview 又位于 recyclerview 中。我试图通过数组列表动态地将数据填充到线性布局中——其中 cardview 的每个线性布局中的元素数量将具有不同的大小。当我执行以下操作时,每次我将其滚动出视图时都会调用 onBindViewHolder,一次又一次地将元素添加到线性布局中。这是回收站视图的适配器。请告诉我如何以正确的方式添加这些元素,这样线性布局就不会过多。
public class CardRecyclerAdapter extends RecyclerView.Adapter<CardRecyclerAdapter.DataObjectHolder> {
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<ElementCard> cardElements;
private static MyClickListener myClickListener;
private Context context;
public static class DataObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView title;
LinearLayout listView;
RelativeLayout relativeLayout;
public DataObjectHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.card_title);
listView = (LinearLayout) itemView.findViewById(R.id.card_listview);
relativeLayout = (RelativeLayout) itemView.findViewById(R.id.card_rellay);
Log.i(LOG_TAG, "Adding Listener");
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
myClickListener.onItemClick(getAdapterPosition(), v);
}
}
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
public CardRecyclerAdapter(ArrayList<ElementCard> myDataset, Context context) {
cardElements = myDataset;
this.context = context;
}
@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.element_card, parent, false);
DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;
}
@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
holder.title.setText(cardElements.get(position).mTransactions.get(0).tCategory);
for (Transaction transaction : cardElements.get(position).mTransactions) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.element_listitem, null, false);
CheckBox checkBox = (CheckBox) view.findViewById(R.id.listitem_checkBox);
checkBox.setText(transaction.tSentence); // set sentence for now -> change later
checkBox.setChecked(transaction.tCompleted); // set checkbox completed or not
holder.listView.addView(view);
}
}
public void addItem(ElementCard dataObj, int index) {
cardElements.add(index, dataObj);
notifyItemInserted(index);
}
public void deleteItem(int index) {
cardElements.remove(index);
notifyItemRemoved(index);
}
@Override
public int getItemCount() {
return cardElements.size();
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
public interface MyClickListener {
public void onItemClick(int position, View v);
}
}
视图在滚动时会被回收,所以LinearLayout中仍然会包含之前绑定添加的子视图。您可以在 LinearLayout 上使用以下代码清除所有视图(只需将视图 ID 替换为您在项目中使用的内容):
LinearLayout myLinearLayout = (LinearLayout) cardView.findViewById(R.id.my_linear_layout);
myLinearLayout.removeAllViews();