2015-04-28 14 views
12

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 ° GroupViewCheckBox 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; 
     } 
    } 
} 
+0

Usa ViewHolder per l'inizializzazione e l'utilizzo delle vostre opinioni nel adattatore – Android

+0

stai affrontando problema durante lo scorrimento? –

+0

@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

risposta

5

Non ho affrontato il problema ma sulla base dello stesso, ho creato un progetto di esempio per te, ti preghiamo di provarci e sono sicuro che ti aiuterà a risolvere il tuo problema.

Expandable Checklist

uscita: -

enter image description here

2
private Context myContext; 

     class ViewHolder { 
     public TextView groupName; 
     public CheckBox groupCheckBox; 

     } 
ViewHolder viewHolder; 
@Override 
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
    viewHolder = new ViewHolder(); 
    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) { 
      // Write Your required code here// 
     } 
    // your other code// 
    return convertView; 
} 

fare questa parte su attività/Frammento in cui le impostazioni dell'adattatore

ExpandableListView mExpandableListView = (ExpandableListView) parent; 
mExpandableListView.expandGroup(groupPosition); 
+0

non sono sicuro dove collocare l'ultima parte ExpandableListView mExpandableListView = (ExpandableListView) parent; mExpandableListView.expandGroup (groupPosition) ;? – turtleboy

+0

dove la tua impostazione ExpAdapter alla tua lista? – Android

+0

il mio onCreate è in edit2 – turtleboy

1

dichiarare il vostro supporto parere definitivo per tutto il tempo. Non lo dichiari definitivo per la prima volta. Crea anche oggetto titolare per getchildview() e dichiaralo definitivo.

se non funziona, si prega di allegare foto se la vostra attività in esecuzione in modo che possiamo avere un'idea migliore che cosa sta succedendo.