我已经创建了一个自定义的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();
但是,这些项目仍然没有得到检查。有人能建议这里可能的问题是什么吗?任何帮助都将不胜感激。
1条答案
按热度按时间ds97pgxw1#
这个问题似乎与onClick方法中列表项的检查和取消检查方式有关。您可以尝试使用listView. setItemChecked(i,isChecked)代替listView. setItemChecked方法,其中isChecked是一个布尔值,指示当前项是否应该被检查或取消检查。以下是onClick方法的更新代码:
在这个更新的代码中,我们根据isChecked参数将当前项设置为选中或未选中,该参数作为参数传递给onClick方法。我们还在更新列表后调用notifyDataSetChanged,以在UI上反映更改。