Ho un DialogFragment che ha una vista elenco con CheckedTextView e una casella di controllo in alto per Controllare e deselezionare tutti gli elementi nella vista elenco. Sto cercando di impostare lo stato di CheckedTextView su Controllato/Deselezionato a seconda dello stato della casella di controllo CheckAll. Ma non sono in grado di aggiornare la vista di conseguenza utilizzando notifyDataSetChanged. notifyDataSetChanged non riesce ad aggiornare ListView
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" />
Aggiornamento del codice. Ho cambiato lo stato di category in valore booleano che è il modo in cui verrà memorizzato nei dati. veri mezzi controllati e viceversa. Ora quando carico il Dialog sto abilitando lo stato basato su isChecked(). Come da codice, facendo clic su controlla tutto ho aggiunto il codice. ma l'interfaccia utente non riflette lo stato selezionato e deselezionato. Ma su Log mostra il giusto valore. con notifyDataSetChanged non sono in grado di aggiornare l'interfaccia utente. –
@HarshaMV Come appare il layout della tua riga? Hai un singolo 'CheckedTextView' o è un' CheckTextView' avvolto da un 'LinearLayout' come nella tua domanda precedente? – Luksprog
un singolo CheckedTextView. aggiornerò il codice in questione –