android 无法取消选中自定义MultiSelectListPreference对话框中的项目

mwkjh3gx  于 2023-03-06  发布在  Android
关注(0)|答案(1)|浏览(138)

我已经创建了一个自定义的MultiSelectListPreference,我可以在这里处理列表中的每一个项目,并将其保存到共享首选项中。如果用户从列表中选择了项目0或1,那么我想取消选择列表中的所有其他项目。然而,当我调用listView.setItemChecked(i, false)时,它并没有改变列表中的任何内容。我也尝试了notifyDataSetChanged和invalidate,但仍然没有成功。
下面是自定义MultiSelectListPreference的代码:

import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.appcompat.app.AlertDialog;
import androidx.preference.MultiSelectListPreference;

import java.util.HashSet;
import java.util.Set;

public class MultiSelectListPreferenceCustom  extends MultiSelectListPreference {
    private final String TAG = "Custom Class Dialog";
    public MultiSelectListPreferenceCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onClick() {

        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle(getDialogTitle());
        builder.setMultiChoiceItems(getEntries(), getSelectedItems(), new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                Log.d(TAG, "onClick: Which Button == "+which+" "+isChecked);
                ListView listView = ((AlertDialog) dialog).getListView();
                Log.d(TAG, "onClick: Get Item Count = "+listView.getCount());
                if (which == 0 || which == 1) {
                    // If "Public" or "All Friends" is selected, uncheck all other items
                    for (int i = 0; i < listView.getCount(); i++) {
                        if (i != which) {
                            listView.setItemChecked(i, false);
                        }
                    }
                } else {
                    // If any other item is selected, uncheck "Public" and "All Friends"
                    listView.setItemChecked(0, false);
                    listView.setItemChecked(1, false);
                }
                ArrayAdapter adapter = (ArrayAdapter) listView.getAdapter();
                adapter.notifyDataSetChanged();

                Log.d(TAG, "onClick: list check = "+listView.getCheckedItemPosition());
            }
        });
        builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Save selected items
                ListView listView = ((AlertDialog) dialog).getListView();
                SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
                Set<String> values = new HashSet<>();
                for (int i = 0; i < checkedPositions.size(); i++) {
                    if (checkedPositions.valueAt(i)) {
                        int position = checkedPositions.keyAt(i);
                        values.add(getEntryValues()[position].toString());
                    }
                }
                setValues(values);
            }

        });
        builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Do nothing
            }
        });
        builder.show();
    }
}

我还尝试在调用listView.setItemChecked(i, false):之后添加以下代码

((ArrayAdapter) listView.getAdapter()).notifyDataSetChanged();
listView.invalidateViews();

但是,这些项目仍然没有得到检查。有人能建议这里可能的问题是什么吗?任何帮助都将不胜感激。

ds97pgxw

ds97pgxw1#

这个问题似乎与onClick方法中列表项的检查和取消检查方式有关。您可以尝试使用listView. setItemChecked(i,isChecked)代替listView. setItemChecked方法,其中isChecked是一个布尔值,指示当前项是否应该被检查或取消检查。以下是onClick方法的更新代码:

@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    Log.d(TAG, "onClick: Which Button == "+which+" "+isChecked);
    ListView listView = ((AlertDialog) dialog).getListView();
    Log.d(TAG, "onClick: Get Item Count = "+listView.getCount());
    if (which == 0 || which == 1) {
        // If "Public" or "All Friends" is selected, uncheck all other items
        for (int i = 0; i < listView.getCount(); i++) {
            if (i != which) {
                listView.setItemChecked(i, false);
            } else {
                listView.setItemChecked(i, isChecked);
            }
        }
    } else {
        // If any other item is selected, uncheck "Public" and "All Friends"
        listView.setItemChecked(0, false);
        listView.setItemChecked(1, false);
    }
    ((ArrayAdapter) listView.getAdapter()).notifyDataSetChanged();

    Log.d(TAG, "onClick: list check = "+listView.getCheckedItemPosition());
}

在这个更新的代码中,我们根据isChecked参数将当前项设置为选中或未选中,该参数作为参数传递给onClick方法。我们还在更新列表后调用notifyDataSetChanged,以在UI上反映更改。

相关问题