我有一个DialogFragment,它有一个带CheckedTextView的列表视图,顶部有一个复选框,用于检查和取消选中列表视图中的所有项目。我试图将CheckedTextView的状态设置为Checked / Unchecked,具体取决于CheckAll复选框的状态。但是我无法使用notifyDataSetChanged相应地更新视图。
CategoriesDialogFragment.java
public class CategoriesDialogFragment extends SherlockDialogFragment {
CheckBox checkAll;
ListView categoriesListView;
CategoriesListAdapter adapter;
static Category category;
String[] categories = new String[] { "Hill Station", "Beach", "Historic",
"Wild Life", "Waterfall", "River", "Archeology", "Hill Station",
"Beach", "Historic", "Wild Life", "Waterfall", "River",
"Archeology" };
Boolean[] categories_state = new Boolean[] { true, false, true, true, true,
true, false, true, false, true, true, true, true, false };
public static CategoriesDialogFragment newInstance() {
CategoriesDialogFragment frag = new CategoriesDialogFragment();
Bundle args = new Bundle();
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = new Dialog(MainActivity.context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_categories);
categoriesListView = (ListView) dialog
.findViewById(R.id.listViewDialog);
List<Category> theCategories = new ArrayList<Category>();
for (int i = 0; i < categories.length; i++) {
Boolean flag;
Category pl = new Category(categories[i], categories_state[i]);
theCategories.add(pl);
}
// categoriesListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
adapter = new CategoriesListAdapter(MainActivity.context,
R.layout.dialog_list_item_category, theCategories);
categoriesListView.setAdapter(adapter);
// List View Item Click Listener
categoriesListView
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
CategoriesListAdapter adapter = (CategoriesListAdapter) parent
.getAdapter();
Category c = (Category) adapter.getItem(position);
c.setChecked(!c.getChecked());
adapter.notifyDataSetChanged();
}
});
// CheckAll CheckBox
checkAll = (CheckBox) dialog.findViewById(R.id.checkBoxAll);
checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Toast.makeText(MainActivity.context, "Check",
Toast.LENGTH_SHORT).show();
for (int i = 0; i < adapter.getCount(); i++) {
categoriesListView.setItemChecked(i, isChecked);
Log.i("Nomad", isChecked + " isChecked " + i);
}
adapter.notifyDataSetChanged();
/*
* if (isChecked) { Log.i("Nomad", "isChecked"); for (int i = 0;
* i < adapter.getCount(); i++) { category = adapter.getItem(i);
* category.setChecked(true); Log.i("Nomad", "isChecked "+i); }
* adapter.notifyDataSetChanged(); } else { Log.i("Nomad",
* "isUnChecked"); for (int i = 0; i < adapter.getCount(); i++)
* { category = adapter.getItem(i); category.setChecked(false);
* Log.i("Nomad", "isUnChecked "+i); }
* adapter.notifyDataSetChanged(); }
*/
}
});
return dialog;
}
private static class CategoriesListAdapter extends ArrayAdapter<Category> {
public Context mContext;
List<Category> mCategories;
public CategoriesListAdapter(Context context, int resource,
List<Category> categories) {
super(context, resource, categories);
// TODO Auto-generated constructor stub
this.mCategories = categories;
this.mContext = context;
}
public int getCount() {
return mCategories.size();
}
@Override
public Category getItem(int position) {
// TODO Auto-generated method stub
return mCategories.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater viewInflater;
viewInflater = LayoutInflater.from(getContext());
convertView = viewInflater.inflate(
R.layout.dialog_list_item_category, null);
holder = new ViewHolder();
holder.categoryName = (CheckedTextView) convertView
.findViewById(R.id.categories_checkbox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.categoryName.setText(mCategories.get(position)
.getCategoryName());
holder.categoryName.setChecked(mCategories.get(position)
.getChecked());
return convertView;
}
static class ViewHolder {
CheckedTextView categoryName;
}
}
}
Category.java
public class Category {
String categoryName = "";
private boolean checked = false;
public Category(String categoryName, boolean checked) {
this.categoryName = categoryName;
this.checked = checked;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public boolean getChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
dialog_categories.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dip"
android:layout_marginStart="8dip"
android:background="@color/primary_white"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/title_template"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dip"
android:layout_marginStart="16dip"
android:gravity="center_vertical|start"
android:orientation="horizontal"
android:paddingTop="5dp" >
<TextView
android:id="@+id/textView1"
style="?android:attr/textAppearanceLarge"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="10dp"
android:text="@string/dialog_category_title"
android:textColor="@color/primary_color"
android:textSize="22sp" />
<TextView
android:id="@+id/all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dialog_category_checkbox"
android:textColor="@color/primary_color" />
<CheckBox
android:id="@+id/checkBoxAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="6dp" />
</LinearLayout>
<View
android:id="@+id/titleDivider"
android:layout_width="match_parent"
android:layout_height="2dip"
android:background="@color/black" />
<LinearLayout
android:id="@+id/contentPanel"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:minHeight="64dp"
android:orientation="vertical" >
<ListView
android:id="@+id/listViewDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
<LinearLayout
android:id="@+id/buttonPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/button_category_ok"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/dialog_category_btn_ok"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
dialog_list_item_category.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/categories_checkbox"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:gravity="center_vertical"
android:onClick="toggle"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="12dp"
android:paddingTop="10dp"
android:text="sss" />
答案 0 :(得分:2)
我正在尝试将CheckedTextView的状态设置为 Checked / Unchecked取决于CheckAll复选框的状态。 但我无法使用相应的更新视图 notifyDataSetChanged。
添加了一个带有问题代码的示例作为我的答案示例。它有效并且can be found here(看看它)。
此外,Android-Developer的回答是有效的,因为每次用户检查/取消选中所有CheckBoxs
时,您基本上都会使用正确的状态重置适配器。这可能是浪费的(但如果列表相对较小,则可以接受)。另请注意,如果categoryName
类的Category
在对话框中发生变化,则需要确保使用正确的名称构建新的Categories
(如果不是
CheckBox
被采取行动时,修改类别名称,这不是问题。
尝试这样的事情:
categoriesListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
修改所有OnCheckedChangeListener
的{{1}},如下所示:
CheckBox
将 @Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Toast.makeText(getActivity(), "Check", Toast.LENGTH_SHORT)
.show();
Log.i("Nomad", "isChecked");
for (int i = 0; i < adapter.getCount(); i++) {
adapter.getItem(i).setChecked(isChecked);
Log.i("Nomad", "isChecked " + i);
}
adapter.notifyDataSetChanged();
}
添加到 categoriesListView OnItemClickListener
,如下所示:
ListView
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
CategoriesListAdapter adapter = (CategoriesListAdapter) arg0
.getAdapter();
Category c = (Category) adapter.getItem(arg2);
c.setChecked(!c.getCheckStatus());
adapter.notifyDataSetChanged();
}
和setChecked(boolean)
(我看到你在getCheckStatus()
中有一个isChecked
方法,你可以用它来获取布尔状态)是方法您的Category
课程,用于设置和获取该项目的状态
在适配器的Category
方法中,设置如下状态:
getView()
答案 1 :(得分:2)
所以你试图在
上设置所有项目 setOnCheckedChangeListener
据我了解。首先,如果你想做你的
adapter.notifyDataSetChanged();
要工作,你必须对你的内容进行编辑。您正在使用
List<Category> theCategories = new ArrayList<Category>();
要填充对话框并更新它,您必须使用与更改数据相同的对话框或创建新适配器。要在setOnCheckedChangeListener
中使用相同的内容,您必须执行以下操作:
checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
theCategories.clear();
Toast.makeText(MainActivity.context, "Check", Toast.LENGTH_SHORT).show();
for (int i = 0; i < categories.length; i++) {
Category pl = new Category(categories[i], true);
theCategories.add(pl);
}
adapter.notifyDataSetChanged();
}
}
});
试试这个,如果它适合你,现在让我。 :)