滚动RecyclerView时复选框的可见性发生变化 [英] Checkbox visibility changes while scrolling RecyclerView

查看:43
本文介绍了滚动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();
}

这篇关于滚动RecyclerView时复选框的可见性发生变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆