Ho il seguente adattatore nel mio Activity
. Ho impostato uno su GroupView
che quando toccato controllerà/deselezionerà le viste secondarie (che hanno anche un CheckBox
).ExpandableListView groupView checkbox deselezionare altre groupviews
Lo stato di CheckBox(true or false)
viene memorizzato nel DB e inizialmente impostato su true/checked. Le caselle di controllo sono inizialmente selezionate.
C'è un comportamento strano quando tocco un GroupCheckbox
, deseleziona anche la casella di controllo che non fa parte dello GroupView
che è stato toccato.
Quindi, ad esempio, se ho 5 GroupViews
e ogni GroupView
ha 5 figli. Se deseleziono il 1 GroupView
, deseleziona tutti i suoi figli ma anche il 3 ° GroupView
CheckBox
ei suoi figli.
Ci sono idee perché?
[Modifica 1]
Ho cancellato frammenti di codice precedenti, sto iniziando una taglia. Il codice è cambiato rispetto all'originale poiché Ankit Kumar mi ha aiutato con il patter di Viewholder nel metodo getGroupView
. Deseleziona ancora più caselle di controllo di groupview quando viene toccata una sola casella di controllo. il DB di supporto ha tutti gli stati delle caselle spuntate come true
per iniziare.
Sembra che la vista non sia sincronizzata con il DB. Ho disconnesso le dichiarazioni che dimostrano che lo stato di tutte le checkbox è vero per iniziare.
C'è un modo per fare solo la casella di controllo che l'utente tocca deseleziona senza influenzare le altre caselle?
public class ExpList extends ExpandableListActivity {
String arrGroupelements[];
String arrChildelements[][];
private static final String TAG = ExpList.class.getSimpleName();
DisplayMetrics metrics;
int width;
ExpandableListView expList;
RROnCallApplication appObj;
Cursor companies;
Button mainMenu;
ExpAdapter adapter;
int companyCount;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e(TAG, "oncreate");
appObj = (RROnCallApplication) getApplication();
mainMenu = (Button)findViewById(R.id.buttonmainmenu);
mainMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(ExpList.this, MenuActivity2.class);
startActivity(i);
}
});
try {
companies = appObj.dbModel.queryAllFromCompanyBranch();
arrGroupelements = new String[companies.getCount()];
Log.e(TAG, "companies count = " + companies.getCount());
arrChildelements = new String[arrGroupelements.length][20];
if(companies != null && companies.getCount() > 0) {
if(companies.moveToFirst()) {
int i = 0;
do {
arrGroupelements[i] = companies.getString(companies.getColumnIndex(DBModel.C_COMPANYBRANCH_NAME));
Log.e(TAG, "arrGroupelements[" + i +"] = " + arrGroupelements[i]);
int compID = appObj.dbModel.getCompanyidFromName(arrGroupelements[i]);
Log.e(TAG, "compID = " + compID);
String[] branchesArr = appObj.dbModel.getBranchNamesfromCompanyId(compID);
Log.e(TAG, "branchesArr length = " + branchesArr.length);
for(int h = 0; h < branchesArr.length; h++) {
arrChildelements[i][h] = branchesArr[h];
}
i++;
}while(companies.moveToNext());
Log.e(TAG, "arrGroupelements size = " + arrGroupelements.length);
}//end of moveToFirst
}
}
catch(Exception e) {
Toast.makeText(this, "There was a problem downloading companies and branches", Toast.LENGTH_LONG).show();
Log.e(TAG, "********Exception = " + e.toString());
}
finally {
companyCount = companies.getCount();
companies.close();
}
expList = getExpandableListView();
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
//this code for adjusting the group indicator into right side of the view
expList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
expList.setAdapter(new ExpAdapter(this));
for(int h = 0; h < companyCount; h++){
expList.expandGroup(h);
}
expList.setOnGroupExpandListener(new OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
Log.e("onGroupExpand", "OK");
Log.e("groupPosition", " " + groupPosition);
}
});
// expList.setOnGroupClickListener(new OnGroupClickListener() {
//
// @Override
// public boolean onGroupClick(ExpandableListView parent, View v,
// int groupPosition, long id) {
//
//
// Log.e(TAG, "groupPosition in onGroupClickListener = " + groupPosition);
//
// int count = 0;
//
// for (int i = 0; i < arrChildelements[groupPosition].length; i++){
//
// if(arrChildelements[groupPosition][i] != null){
//
// count += arrChildelements[groupPosition][i] != null ? 1 : 0;
//
// Log.e("TAG", "child count in onGroupClickListener = " + count);
// Log.e(TAG, "arrChildelements[groupPosition][i] = " + arrChildelements[groupPosition][i]);
//
// int branchID = appObj.dbModel.getBranchIdFromName(arrChildelements[groupPosition][i]);
//
// appObj.dbModel.updateBranchSelectedStatus(String.valueOf(branchID), "N");
//
//
//
// }//end of if
//
// }//end of for loop
//
//
//
// return false;
// }
// });
expList.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
Log.e("onGroupCollapse", "OK");
}
});
expList.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Log.e("OnChildClickListener", "OK Group = " + groupPosition + " child = " + childPosition);
TextView tvBranchName = (TextView) v.findViewById(R.id.tvPlayerName);
String branchName = tvBranchName.getText().toString();
Log.e(TAG, "branch name = " + branchName);
int branchID = appObj.dbModel.getBranchIdFromName(branchName);
Log.e(TAG, "branch ID = " + branchID);
String companyName = arrGroupelements[groupPosition];
Log.e(TAG, "**********CompanyName = " + companyName);
final CheckBox cb = ((CheckBox)v.findViewById(R.id.checkbox));
if(cb.isChecked() == true) {
Log.e(TAG, "checkBox is true but setting it to false now");
cb.setChecked(false);
appObj.dbModel.updateBranchSelectedStatus(String.valueOf(branchID), "N");
Log.e(TAG, "just called updateBranchSelectedStatus with values " + String.valueOf(branchID) + " " + "N");
Log.e(TAG, "Branches selected are " + appObj.dbModel.getBranchList());
if(appObj.dbModel.isCompanySelected(companyName) == false){
//set companySeelcted to false
appObj.dbModel.updateCompanySelectedStatus(companyName, "N");
Log.e(TAG, "Setting company to no longer selected as no branches are selected for " + companyName);
}
}
else {
Log.e(TAG, "checkBox is false but setting it to true");
cb.setChecked(true);
appObj.dbModel.updateBranchSelectedStatus(String.valueOf(branchID), "Y");
Log.e(TAG, "just called updateBranchSelectedStatus with values " + String.valueOf(branchID) + " " + "Y");
Log.e(TAG, "Branhes selected are " + appObj.dbModel.getBranchList());
//set company to selected
appObj.dbModel.updateCompanySelectedStatus(companyName, "Y");
}
return false;
}
});
}//end of onCreate
@Override
public void onBackPressed() {
super.onBackPressed();
Intent i = new Intent(this, OnCallMenuActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
public int GetDipsFromPixel(float pixels) {
// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
return (int) (pixels * scale + 0.5f);
}
public class ExpAdapter extends BaseExpandableListAdapter {
private Context myContext;
class ViewHolder {
public TextView groupName;
public CheckBox groupCheckBox;
}
public ExpAdapter(Context context) {
myContext = context;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.child_row, null);
}
TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName);
tvPlayerName.setText(arrChildelements[groupPosition][childPosition]);
CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkbox);
int branchID = appObj.dbModel.getBranchIdFromName(arrChildelements[groupPosition][childPosition]);
Log.e(TAG, "inside getchildView and branchID = " + branchID);
boolean isBranchSelected = appObj.dbModel.isBranchSelected(String.valueOf(branchID));
Log.e(TAG, "isBranchSelected = " + isBranchSelected);
if(isBranchSelected == true) {
cb.setChecked(true);
Log.e(TAG, "inside getchildView and cb.setChecked(true)");
}
else {
cb.setChecked(false);
Log.e(TAG, "inside getchildView and cb.setChecked(false)");
}
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
//return arrChildelements[groupPosition].length;
Log.e(TAG, "getChildrenCount");
int count = 0;
for (int i = 0; i < arrChildelements[groupPosition].length; i++)
count += arrChildelements[groupPosition][i] != null ? 1 : 0;
return count;
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public int getGroupCount() {
Log.e(TAG, "getGroupCount");
return arrGroupelements.length;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
ViewHolder viewHolder;
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
Log.e(TAG, "getGroupView");
viewHolder = new ViewHolder();
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.group_row, null);
viewHolder.groupName = (TextView) convertView.findViewById(R.id.tvGroupName);
viewHolder.groupCheckBox = (CheckBox) convertView.findViewById(R.id.groupcheckbox);
convertView.setTag(viewHolder);
} else viewHolder = (ViewHolder) convertView.getTag();
final ViewHolder holder = viewHolder;
holder.groupName.setText(arrGroupelements[groupPosition]);
holder.groupCheckBox.setTag(groupPosition);
holder.groupCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos = (Integer) holder.groupCheckBox.getTag();
Log.e(TAG, "oncheckChanged has fired at position " + pos);
int yCount = 0;
Cursor c = appObj.dbModel.queryAllFromCompanyBranch();
c.moveToFirst();
do {
String str = c.getString(c.getColumnIndex(DBModel.C_COMPANYBRANCH_SELECTED));
if(str.equalsIgnoreCase("Y")) {
yCount++;
}
} while(c.moveToNext());
Log.e(TAG, "yCount before = " + yCount);
if(isChecked == true) {
Log.e(TAG, "checkBox true");
int count = 0;
for (int i = 0; i < getChildrenCount(pos); i++) {
if(arrChildelements[pos][i] != null) {
count += arrChildelements[pos][i] != null ? 1 : 0;
Log.e("TAG", "child count in onGroupClickListener = " + count);
Log.e(TAG, "arrChildelements[groupPosition][i] = " + arrChildelements[pos][i]);
int branchID = appObj.dbModel.getBranchIdFromName(arrChildelements[pos][i]);
appObj.dbModel.updateBranchSelectedStatus(String.valueOf(branchID), "Y");
appObj.dbModel.updateCompanySelectedStatus(arrGroupelements[pos], "Y");
}//end of if
}//end of for loop
}
else if(isChecked == false) {
Log.e(TAG, "checkBox false");
int count = 0;
for (int i = 0; i < getChildrenCount(pos); i++) {
if(arrChildelements[pos][i] != null) {
count += arrChildelements[pos][i] != null ? 1 : 0;
Log.e("TAG", "child count in onGroupClickListener = " + count);
Log.e(TAG, "arrChildelements[groupPosition][i] = " + arrChildelements[pos][i]);
int branchID = appObj.dbModel.getBranchIdFromName(arrChildelements[pos][i]);
appObj.dbModel.updateBranchSelectedStatus(String.valueOf(branchID), "N");
appObj.dbModel.updateCompanySelectedStatus(arrGroupelements[pos], "N");
Log.e(TAG, "Setting company to no longer selected as no branches are selected for " + arrGroupelements[pos]);
}//end of if
}//end of for loop
}
int yCount2 = 0;
Cursor c2 = appObj.dbModel.queryAllFromCompanyBranch();
c2.moveToFirst();
do {
String str2 = c2.getString(c2.getColumnIndex(DBModel.C_COMPANYBRANCH_SELECTED));
if(str2.equalsIgnoreCase("Y")){
yCount2++;
}
} while(c2.moveToNext());
Log.e(TAG, "yCount2 after = " + yCount2);
notifyDataSetChanged();
}
});
ExpandableListView mExpandableListView = (ExpandableListView) parent;
mExpandableListView.expandGroup(groupPosition);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}
Usa ViewHolder per l'inizializzazione e l'utilizzo delle vostre opinioni nel adattatore – Android
stai affrontando problema durante lo scorrimento? –
@AnkitKumar Un viewHolder accelera la reattività dell'adattatore non dovendo cercare gli oggetti ma questo spiega perché quando tocco una casella di controllo GroupView viene selezionata anche un'altra vista di gruppo? – turtleboy