滚动RecyclerView时复选框的可见性发生变化
在将其标记为重复之前,我已经读过很多关于此的文章,但没有找到解决方案的答案.
before you flag this as duplicate i have read a lot of posts about this but haven't found an answer to my solution.
我有一个RecyclerView
,其中填充了数据库中的一些数据.每个RecyclerView
项目都有一个CheckBox
,最初是android:visibility="gone"
.然后,我按下按钮,并且RecyclerView
的每个项目的CheckBox
应该出现.当我向下滚动以查看是否所有复选框都出现时,顶部的复选框被隐藏了.
I have a RecyclerView
being populated with some data from database. Each RecyclerView
item has a CheckBox
originally with android:visibility="gone"
. Then i press the button and each item's CheckBox
of the RecyclerView
should appear. As i scroll down to see if all CheckBoxes appeared the top CheckBoxes are hidden.
我的代码:
private void setupButtonCallbacks() {
modify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int position=0; position<recyclerView.getChildCount();position++){
recyclerView.getChildAt(position).findViewById(R.id.deleteCheckCartItem).setVisibility(View.VISIBLE);
recyclerView.getChildAt(position).findViewById(R.id.deleteCheckCartItem).setTag(position);
}
adapter.notifyDataSetChanged();
}
});
}
适配器:
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.CartViewHolder>{
List<CartList> cartItems;
Context context;
CartList lista;
public CartAdapter(List<CartList> cartItems, Context context){
this.cartItems = cartItems;
this.context = context;
}
@Override
public CartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_row_item, parent, false);
CartViewHolder pvh = new CartViewHolder(view);
return pvh;
}
@Override
public void onBindViewHolder(final CartViewHolder holder, final int position) {
holder.cartProductName.setText(cartItems.get(position).getName());
holder.cartProductprice.setText(cartItems.get(position).getPrice());
holder.pref1.setText(cartItems.get(position).getPreferation1());
holder.pref2.setText(cartItems.get(position).getPreferation2());
holder.pref3.setText(cartItems.get(position).getPreferation3());
holder.pref4.setText(cartItems.get(position).getPreferation4());
holder.quantity.setText(cartItems.get(position).getQuantity());
Ion.with(holder.cartProductImage).placeholder(R.mipmap.placeholder).error(R.mipmap.placeholder).load(cartItems.get(position).getImage());
final CartList list = cartItems.get(position);
holder.checkBox.setTag(list);
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (holder.checkBox.isChecked()){
Toast.makeText(context, "Item Checked is " + cartItems.get(position).getName(), Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public int getItemCount() {
return cartItems.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public static class CartViewHolder extends RecyclerView.ViewHolder {
CardView cardView;
CheckBox checkBox;
TextView cartProductName, cartProductprice, pref1, pref2, pref3, pref4, quantity;
ImageView cartProductImage;
LinearLayout linearLayout;
CartViewHolder(View itemView) {
super(itemView);
cardView = (CardView)itemView.findViewById(R.id.card_view);
linearLayout = (LinearLayout)itemView.findViewById(R.id.rootLinear);
checkBox = (CheckBox)itemView.findViewById(R.id.deleteCheckCartItem);
cartProductName = (TextView)itemView.findViewById(R.id.product_name_cart);
cartProductprice = (TextView)itemView.findViewById(R.id.product_price_cart);
pref1 = (TextView)itemView.findViewById(R.id.pref1_text_cart);
pref2 = (TextView)itemView.findViewById(R.id.pref2_text_cart);
pref3 = (TextView)itemView.findViewById(R.id.pref3_text_cart);
pref4 = (TextView)itemView.findViewById(R.id.pref4_text_cart);
quantity = (TextView)itemView.findViewById(R.id.quantity_text_cart);
cartProductImage = (ImageView)itemView.findViewById(R.id.product_image_cart);
}
}
}
布局:
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp">
<LinearLayout
android:id="@+id/rootLinear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
android:visibility="gone"
android:focusable="false"
android:layout_gravity="center_vertical"
android:id="@+id/deleteCheckCartItem" />
结果是:
前2项行为正常,并且
最后两个没有可见的复选框
and the last two are not having CheckBoxes visible
更新 根据我的建议,我试图保持这样的位置可见:
Update As I was suggested i tried to keep track of the positions visible like this:
private void setupButtonCallbacks() {
modify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int position = 0; position < recyclerView.getChildCount(); position++) {
recyclerView.getChildAt(position).findViewById(R.id.deleteCheckCartItem).setVisibility(View.VISIBLE);
cartItems.get(position).setCheckboxIsVisible(true);
adapter.notifyDataSetChanged();
}
actionMode = startSupportActionMode(actionModeCallback);
actionMode.setTitle(getString(R.string.selected_modifiable_items));
}
});
}
还有适配器:
@Override
public void onBindViewHolder(final CartViewHolder holder, final int position) {
holder.cartProductName.setText(cartItems.get(position).getName());
holder.cartProductprice.setText(cartItems.get(position).getPrice());
holder.pref1.setText(cartItems.get(position).getPreferation1());
holder.pref2.setText(cartItems.get(position).getPreferation2());
holder.pref3.setText(cartItems.get(position).getPreferation3());
holder.pref4.setText(cartItems.get(position).getPreferation4());
holder.quantity.setText(cartItems.get(position).getQuantity());
Ion.with(holder.cartProductImage).placeholder(R.mipmap.placeholder).error(R.mipmap.placeholder).load(cartItems.get(position).getImage());
lista = cartItems.get(position);
holder.checkBox.setVisibility(lista.isCheckboxIsVisible()?View.VISIBLE:View.GONE);
holder.checkBox.setChecked(lista.isChecked());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (holder.checkBox.isChecked()) {
//Toast.makeText(context, "Item Checked is " + cartItems.get(position).getName(), Toast.LENGTH_SHORT).show();
boolean condition = cartItems.get(position).isChecked();
condition = isChecked;
}
}
});
}
它仅用于列表中的前3个项目,然后没有一个被选择...
It only makes it for the first 3 items on the list and then none of them is selected...
有什么想法吗?预先谢谢!!!
Any ideas? Thanks in advance!!!
您的CartList cartItems
需要跟踪可见性和复选框状态.
Your CartList cartItems
needs to keep track of the visibility and checkbox state.
class CartList
...
boolean checkboxIsVisible=false;//todo add setters and getters
boolean isChecked=false;//todo add setters and getters
然后在onBindViewHolder()
then in onBindViewHolder()
final CartList list = cartItems.get(position);
holder.checkBox.setVisible(list.checkboxIsVisible?View.VISIBLE:View.GONE);
holder.checkBox.setChecked(list.isChecked)
选中
...
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
...
cartItems.get(position).isChecked=isChecked;
}
modify
可见性
...
@Override
public void onClick(View v) {
...//Some logic here that sets visibility to true or false
recyclerView.getChildAt(position).checkboxIsVisible=true;
...
adapter.notifyDataSetChanged();
}