android - 如何在android中的gridview滚动中保留复选框状态

标签 android android-gridview android-checkbox

  • 我在做什么::我有一个 gridview,我在其中显示图像 gridview 的适配器有图像和一个 复选框
  • 发生了什么::当我选中复选框并向下滚动 gridview 时,当我回滚 时,选中的 复选框是 未选中
  • 问题::我如何防止这种情况 我需要对代码进行哪些更改

grid_view_image_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/flag"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_alignParentRight="true"
        android:scaleType="centerCrop"
        android:background="#000000"
        android:padding="1dp" />

    <CheckBox
        android:id="@+id/ch_bx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="CheckBox" />

</RelativeLayout>

AdapterGridViewImage.java

public class AdapterGridViewImage extends BaseAdapter {

    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    HashMap<String, String> resultp = new HashMap<String, String>();

    public AdapterGridViewImage(Context context,
            ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
        //imageLoader = new ImageLoader(context);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    public View getView(final int position, View convertView, ViewGroup parent) {
        ImageView flag;
        CheckBox ch_bx;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.grid_view_image_item, parent, false);
        resultp = data.get(position);
        flag = (ImageView) itemView.findViewById(R.id.flag);
        ch_bx=(CheckBox) itemView.findViewById(R.id.ch_bx);
        //Picasso.with(context).load("http://10.0.2.2:3009/buffet_items/".trim()+resultp.get("item_image").trim()).into(flag);

         Picasso.with(context)
          .load("http://10.0.2.2:3009/buffet_items/".trim()+resultp.get("item_image").trim())
          .resizeDimen(R.dimen.wanted_size,R.dimen.wanted_size).centerCrop().into(flag);

        return itemView;
    }
}

最佳答案

请修改您的代码。
1)我们必须使用ViewHolder类进行封装。
2) 我们必须设置复选框的标签值,以便在那时重新创建 View 时我们可以从标签中获取值。

 public AdapterGridViewImage(Context context,
                        ArrayList<HashMap<String, String>> arraylist) {
                    this.context = context;
                    data = arraylist;
                    //imageLoader = new ImageLoader(context);
                    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            }

            @Override
            public int getCount() {
                return data.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

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

            public View getView(final int position, View convertView, ViewGroup parent) 
            {
                final ViewHolder holder;
                if(convertView==null)
                {
                    holder=new ViewHolder();
                    convertView = inflater.inflate(R.layout.grid_view_image_item, parent, false);
                    holder.flag = (ImageView) convertView.findViewById(R.id.flag);
                    holder.ch_bx=(CheckBox) convertView.findViewById(R.id.ch_bx);
holder.ch_bx.setTag(false);
                    convertView.setTag(holder);
                }
                else
                {
                    holder=(ViewHolder)convertView.getTag();
                }

                resultp = data.get(position);

                if((Boolean)holder.ch_bx.getTag())
                {
                    holder.ch_bx.setChecked(true);
                }
                else
                {
                    holder.ch_bx.setChecked(false);
                }

                holder.ch_bx.setOnClickListener(new OnClickListener()
                {

                    @Override
                    public void onClick(View v)
                    {
                        if(holder.ch_bx.isChecked())
                        {
                            holder.ch_bx.setTag(true);
                        }
                        else
                        {
                            holder.ch_bx.setTag(false);
                        }
                    }
                });
                //Picasso.with(context).load("http://10.0.2.2:3009/buffet_items/".trim()+resultp.get("item_image").trim()).into(flag);

                 Picasso.with(context)
                  .load("http://10.0.2.2:3009/buffet_items/".trim()+resultp.get("item_image").trim())
                  .resizeDimen(R.dimen.wanted_size,R.dimen.wanted_size).centerCrop().into(holder.flag);

                return itemView;
            }
            class ViewHolder
            {
                ImageView flag;
                CheckBox ch_bx;
            }

关于android - 如何在android中的gridview滚动中保留复选框状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24015510/

相关文章:

java - 无法在 RemoteViewsFactory 中加载多个图像

android - setSelected(true) 不适用于自定义 View

java - RecyclerView 中的网格项未正确显示

android - 为什么 CheckBox 检查不能以编程方式与 Kotlin 一起使用?

java - Android 复选框通过 SharedPreferences 保存和显示

android - 将 android EditText 样式从矩形边框更改为下划线

android - 读取特定密度的 mipmap 资源

android - 如何让 Android 按钮变小?

android - 设置未选中复选框Android的背景颜色

java - 使用公司品牌名称命名类和资源