簡體   English   中英

帶復選框的ListView,滾動問題

[英]ListView with Checkboxes, issues with scrolling

我已經研究了針對此問題的其他幾種解決方案,但是似乎它們都根本不同,因此似乎沒有一個對我有用。 我的適配器中有PackageInfo類,該類負責列出設備上安裝的應用程序。 那部分起作用。 每個應用程序旁邊都有兩個復選框,可將該應用程序分類為類別1或2。我將用戶的選擇存儲在SharedPreference中(也可能會提供有關存儲所有用戶輸入的更好方法的反饋,但這很有幫助,但這不是我的主要關注點)。

我已經研究了其他幾種解決方案,但是我認為這里根本上缺少一些東西,問題是用戶滾動時,復選框是否被隨機選中或未選中。

public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    LayoutInflater inflater = context.getLayoutInflater();


    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_layout, null);
        holder = new ViewHolder();
        holder.apkName = (TextView) convertView.findViewById(R.id.appname);
        holder.category1 = (CheckBox) convertView.findViewById(R.id.arcade);
        holder.category1.setTag(position);
        holder.category2 = (CheckBox) convertView.findViewById(R.id.educational);
        holder.category2.setTag(position);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    PackageInfo packageInfo = (PackageInfo) getItem(position);
    Drawable appIcon = packageManager.getApplicationIcon(packageInfo.applicationInfo);
    final String appName = packageManager.getApplicationLabel(packageInfo.applicationInfo).toString();
    final String appPositionArcade = "cat1"+appName;
    final String appPositionEdu = "cat2"+appName;
    appIcon.setBounds(0, 0, 55, 55);
    holder.apkName.setCompoundDrawables(appIcon, null, null, null);
    holder.apkName.setCompoundDrawablePadding(15);
    holder.apkName.setText(appName);

    holder.category1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (holder.category1.isChecked()) {
                holder.category2.setChecked(false);
                SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0);
                SharedPreferences.Editor editor = stored.edit();

                editor.putBoolean(appPositionArcade, true);
                editor.putBoolean(appPositionEdu, false);
            } else if (!holder.category1.isChecked()) {
                SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0);
                SharedPreferences.Editor editor = stored.edit();

                editor.putBoolean(appPositionArcade, false);
            }
        }
    });

    holder.category2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (holder.category2.isChecked()) {
                SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0);
                SharedPreferences.Editor editor = stored.edit();

                holder.category1.setChecked(false);
                editor.putBoolean(appPositionArcade, false);
                editor.putBoolean(appPositionEdu, true);
            } else if (!holder.category2.isChecked()) {
                SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0);
                SharedPreferences.Editor editor = stored.edit();

                editor.putBoolean(appPositionEdu, false);
            }
        }
    });

    return convertView;
}

您可能會遇到視圖重新整理問題。 您需要顯式設置holder.category1和holder.category2的狀態。

因為發生的事情是視圖被回收時,並且您偶然從觸發您的onclicklistener的另一行數據中獲取了布爾值。

嘗試移動convertView.setTag(holder); return convertView;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM