2012-04-11 7 views
5

Ho una vista elenco espansa con caselle di controllo nei nodi parent e articoli secondari. tutti i dati provengono dal servizio web quindi è dinamico.come ottenere l'id delle caselle di controllo in un elenco ingrandito?

immagine allegata:

enter image description here

Ora sulla voce di menu del tasto voglio prendere tutto lo stato casella di controllo. per favore guidami come posso ottenere l'id delle caselle di controllo usate in esso.

codice

allegato:

/** 
* 
*/ 


    public class Object_SecurityActivity extends ExpandableListActivity { 
     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
       int groupPosition, int childPosition, long id) { 
      // TODO Auto-generated method stub 
      return super.onChildClick(parent, v, groupPosition, childPosition, id); 
     } 

     @Override 
     public void onContentChanged() { 
      // TODO Auto-generated method stub 
      super.onContentChanged(); 
     } 

     private AndroidClientEntity obj_android_client; 
     private static final String LOG_TAG = "ElistCBox2"; 
     private String username, password, clientname; 

     @Override 
     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      //setContentView(R.layout.main); 
      Intent security_intent = getIntent(); 
      String id = security_intent.getStringExtra("id"); 
      obj_android_client = (AndroidClientEntity) getApplicationContext(); 
      username = obj_android_client.getUsername(); 
      password = obj_android_client.getPassword(); 
      clientname = obj_android_client.getClientName(); 
      new Securityasync().execute(username, password, clientname, id); 

     } 

     class Securityasync extends AsyncTask<String, String, String> { 
      String sesurity_response = null; 
      ProgressDialog dialog; 
      private Expandable_list_Adapter expListAdapter; 

      @Override 
      protected String doInBackground(String... params) { 
       if ((isOnline(Object_SecurityActivity.this).equals("true"))) { 
        Security_service security_obj = new Security_service(); 
        try { 
         sesurity_response = security_obj.getUsersRoles(params[0], 
           params[1], params[2], params[3]); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       if (isOnline(Object_SecurityActivity.this).equals("true")) { 

        setContentView(R.layout.layout_expandable_listview); 
        ArrayList<String> groupNames = new ArrayList<String>(); 
        ArrayList<String> sub = new ArrayList<String>(); 
        ArrayList<ArrayList<String>> child = new ArrayList<ArrayList<String>>(); 
        ArrayList<String> sub_id = new ArrayList<String>(); 
        ArrayList<String> objrid = new ArrayList<String>(); 
        try { 
         JSONArray json = new JSONArray(sesurity_response); 
         // JSONArray json_child=new JSONArray(sesurity_response); 
         for (int i = 0; i < json.length(); i++) { 
          JSONObject json_obj = json.getJSONObject(i); 
          if (json_obj.getString("PRid").equalsIgnoreCase("0")) { 

           String ObjectRid = json_obj.getString("ObjectRid"); 
           int m=0; 
           objrid.add(m,ObjectRid); 
           m++; 
           groupNames.add(json_obj.getString("Name")); 
           for (int j = 0; j < json.length(); j++) { 

            JSONObject json_child = json.getJSONObject(j); 
            if (ObjectRid.equalsIgnoreCase(json_child 
              .getString("PRid"))) { 
             int n=0; 
             sub_id.add(n,json_child.getString("ObjectRid")); 
             sub.add(json_child.getString("Name")); 
            } 

           } 
           child.add(sub); 

          } 

         } 
         expListAdapter = new Expandable_list_Adapter(getBaseContext(), 
           groupNames, child); 
         setListAdapter(expListAdapter); 
         Log.e("size in error", "son " + json.length()); 
        } catch (JSONException e) { 
         Log.e("", "", e); 
         Toast.makeText(getBaseContext(), "parsing error", 
           Toast.LENGTH_LONG).show(); 
        } 
        Log.e("sizeof list", ""+sub_id.size()); 
        Iterator itr=objrid.iterator(); 


        while(itr.hasNext()){ 
         Log.e("id","value "+itr.next()); 
        } 

       } 
      } 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

      } 
     } 

    } 

e l'adattatore classe:

public class Expandable_list_Adapter extends BaseExpandableListAdapter implements OnCheckedChangeListener { 

    private Context context; 
    private ArrayList<String> groupNames; 
    private ArrayList<ArrayList<String>> child; 
    private LayoutInflater inflater; 

    public Expandable_list_Adapter(Context context, 
         ArrayList<String> groupNames, 
         ArrayList<ArrayList<String>> child) { 
     this.context = context; 
     this.groupNames= groupNames; 
     this.child = child; 
     inflater = LayoutInflater.from(context); 
    } 

    public Object getChild(int groupPosition, int childPosition) { 
     return child.get(groupPosition).get(childPosition); 
    } 

    public long getChildId(int groupPosition, int childPosition) { 
     return (long)(groupPosition*1024+childPosition); // Max 1024 children per group 
    } 

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     View v = null; 
     if(convertView != null) 
      v = convertView; 
     else 
      v = inflater.inflate(R.layout.child_row, parent, false); 
     String c = (String)getChild(groupPosition, childPosition); 
     TextView color = (TextView)v.findViewById(R.id.childname); 
     if(color != null) 
      color.setText(c); 

     CheckBox cb = (CheckBox)v.findViewById(R.id.check1); 

     //cb.setChecked(false); 
     cb.setOnCheckedChangeListener(this); 
     return v; 
    } 

    public int getChildrenCount(int groupPosition) { 
     return child.get(groupPosition).size(); 
    } 

    public Object getGroup(int groupPosition) { 
     return groupNames.get(groupPosition);   
    } 

    public int getGroupCount(){ 
     return groupNames.size(); 
    } 
    public long getGroupId(int groupPosition) { 
     return (long)(groupPosition*1024); // To be consistent with getChildId 
    } 

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     View v = null; 
     if(convertView != null) 
      v = convertView; 
     else 
      v = inflater.inflate(R.layout.group_row, parent, false); 
     String gt = (String)getGroup(groupPosition); 
     TextView colorGroup = (TextView)v.findViewById(R.id.childname); 
     if(gt != null) 
      colorGroup.setText(gt); 
     CheckBox cb = (CheckBox)v.findViewById(R.id.check2); 
     cb.setChecked(false); 
     return v; 
    } 

    public boolean hasStableIds() { 
     return true; 
    } 

    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     Log.e("is group checked","group "+groupPosition); 
     Log.e("selectable","has" +childPosition); 
     return true; 
    } 

    public void onGroupCollapsed (int groupPosition) {} 
    public void onGroupExpanded(int groupPosition) {} 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // TODO Auto-generated method stub 

    } 
public void isChecked(){ 

} 

} 

Child.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
     android:background="#21415A" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TextView android:id="@+id/childname" 
     android:paddingLeft="50px" 
     android:focusable="false" 
     android:textSize="14px" 
     android:textStyle="italic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <TextView android:id="@+id/rgb" 
     android:focusable="false" 
     android:textSize="14px" 
     android:textStyle="italic" 
     android:layout_width="100px" 
     android:layout_height="wrap_content"/> 

    <CheckBox 
     android:id="@+id/check1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:focusable="false" /> 

</RelativeLayout> 

parent.xml è lo stesso bambino.

per favore indicami come posso ottenere l'id delle caselle di controllo perché sulla voce di menu selezionata devo fare le operazioni di base su quello.

Modifica: ho provato a setTag() e getTag(). ma ora la vista elenco espandibile mostra un comportamento strano. quando seleziono una casella di controllo ed espandi un altro gruppo, tutte le caselle chekbok sono impostate sui valori predefiniti. Cosa devo fare in questo caso. non conosco il motivo per cui non sta salvando lo stato. Io sono faceing stesso problema come Strange behaviour in Expandablelistview - Android Plz guidare

risposta

1

finalmente risolto il mio problema. classe di adattatori:

public class Expandable_list_Adapter extends BaseExpandableListAdapter implements OnCheckedChangeListener { 

    private Context context; 
    private ArrayList<String> groupNames; 
    private ArrayList<ArrayList<String>> child; 
    private LayoutInflater inflater; 

    public Expandable_list_Adapter(Context context, 
         ArrayList<String> groupNames, 
         ArrayList<ArrayList<String>> child) { 
     AndroidClientEntity.objHasmap.clear(); 
     this.context = context; 
     this.groupNames= groupNames; 
     this.child = child; 
     inflater = LayoutInflater.from(context); 
    } 

    public Object getChild(int groupPosition, int childPosition) { 
     return child.get(groupPosition).get(childPosition); 
    } 

    public long getChildId(int groupPosition, int childPosition) { 
     return (long)(groupPosition*1024+childPosition); // Max 1024 children per group 
    } 

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     View v = null; 
     if(convertView != null) 
      v = convertView; 
     else 
      v = inflater.inflate(R.layout.child_row, parent, false); 
     String c = (String)getChild(groupPosition, childPosition); 
     Log.e("hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",c); 

     TextView label = (TextView)v.findViewById(R.id.childname); 
     if(label != null) 
      label.setText(c); 

     CheckBox cb = (CheckBox)v.findViewById(R.id.check1); 
     //cb.setId(childPosition); 
     cb.setTag(groupPosition+"child"+childPosition); 
     cb.setChecked(false); 
     if(AndroidClientEntity.objHasmap.get(groupPosition+"child"+childPosition)!=null) 
     { 
     cb.setChecked(AndroidClientEntity.objHasmap.get(groupPosition+"child"+childPosition)); 
     } 
    // cb.setOnCheckedChangeListener(this); 
     return v; 
    } 

    public int getChildrenCount(int groupPosition) { 
     return child.get(groupPosition).size(); 
    } 

    public Object getGroup(int groupPosition) { 

     return groupNames.get(groupPosition);   
    } 

    public int getGroupCount(){ 
     return groupNames.size(); 
    } 
    public long getGroupId(int groupPosition) { 
     return (long)(groupPosition*1024); // To be consistent with getChildId 
    } 

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     View v = null; 
     if(convertView != null) 
      v = convertView; 
     else 
      v = inflater.inflate(R.layout.group_row, parent, false); 
     String gt = (String)getGroup(groupPosition); 
     TextView colorGroup = (TextView)v.findViewById(R.id.childname); 
     if(gt != null) 
      colorGroup.setText(gt); 
     CheckBox cb = (CheckBox)v.findViewById(R.id.check2); 
     cb.setTag(groupPosition+"cbgroup"); 
     //Object_SecurityActivityobjHasmap.put(groupPosition+"cbgroup", false); 
     cb.setChecked(false); 
     return v; 
    } 

    public boolean hasStableIds() { 
     return true; 
    } 

    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     Log.e("is group checked","group "+groupPosition); 
     Log.e("selectable","has" +childPosition); 
     return true; 
    } 

    public void onGroupCollapsed (int groupPosition) {} 
    public void onGroupExpanded(int groupPosition) {} 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // TODO Auto-generated method stub 



    } 
public void isChecked(){ 

} 

} 

e l'attività di classe:

public class Object_SecurityActivity extends ExpandableListActivity implements OnClickListener{ 

@Override 
public boolean onChildClick(ExpandableListView parent, View v, 
     int groupPosition, int childPosition, long id) { 
    // TODO Auto-generated method stub 
    CheckBox cb=(CheckBox) v.findViewWithTag(groupPosition+"child"+childPosition); 
//Boolean state=objHasmap.get(groupPosition+"child"+childPosition); 
    cb.toggle(); 
    if(cb.isChecked()) 
    { 
     AndroidClientEntity.objHasmap.put(groupPosition+"child"+childPosition,true); 

    }else 
    {AndroidClientEntity.objHasmap.remove(groupPosition+"child"+childPosition); 

    } 

    //add value in set 
//cb.setEnabled(state); 
    return super.onChildClick(parent, v, groupPosition, childPosition, id); 
} 



private AndroidClientEntity obj_android_client; 
private static final String LOG_TAG = "ElistCBox2"; 
private String username, password, clientname; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    //setContentView(R.layout.main); 
    Intent security_intent = getIntent(); 
    String id = security_intent.getStringExtra("id"); 

    obj_android_client = (AndroidClientEntity) getApplicationContext(); 
    username = obj_android_client.getUsername(); 
    password = obj_android_client.getPassword(); 
    clientname = obj_android_client.getClientName(); 
    new Securityasync().execute(username, password, clientname, id); 

} 

public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(getApplication()).inflate(R.menu.context_menu_security, 
      menu); 
    return (super.onPrepareOptionsMenu(menu)); 
} 
public boolean onOptionsItemSelected(MenuItem item) { 
    // startDownload(); 
    if (item.getItemId() == R.id.setsecurity) { 
     //code here 
     Log.e("hiiiiiiiiiiiiiiii","scejkkl yu menu pressed"); 
     } 
    return (super.onOptionsItemSelected(item)); 
} 
class Securityasync extends AsyncTask<String, String, String> { 
    String sesurity_response = null; 
    ProgressDialog dialog; 
    private Expandable_list_Adapter expListAdapter; 

    @Override 
    protected String doInBackground(String... params) { 
     if ((isOnline(Object_SecurityActivity.this).equals("true"))) { 
      Security_service security_obj = new Security_service(); 
      try { 
       sesurity_response = security_obj.getUsersRoles(params[0], 
         params[1], params[2], params[3]); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if (isOnline(Object_SecurityActivity.this).equals("true")) { 

      setContentView(R.layout.layout_expandable_listview); 
      ArrayList<String> groupNames = new ArrayList<String>(); 
      ArrayList<String> sub = new ArrayList<String>(); 
      ArrayList<ArrayList<String>> child = new ArrayList<ArrayList<String>>(); 
      ArrayList<String> sub_id = new ArrayList<String>(); 
      ArrayList<String> objrid = new ArrayList<String>(); 
      try { 
       JSONArray json = new JSONArray(sesurity_response); 
       // JSONArray json_child=new JSONArray(sesurity_response); 
       for (int i = 0; i < json.length(); i++) { 
        JSONObject json_obj = json.getJSONObject(i); 
        if (json_obj.getString("PRid").equalsIgnoreCase("0")) { 

         String ObjectRid = json_obj.getString("ObjectRid"); 
         int m=0; 
         objrid.add(m,ObjectRid); 
         m++; 
         groupNames.add(json_obj.getString("Name")); 
         for (int j = 0; j < json.length(); j++) { 
          JSONObject json_child = json.getJSONObject(j); 
          if (ObjectRid.equalsIgnoreCase(json_child 
            .getString("PRid"))) { 
           int n=0; 
           sub_id.add(n,json_child.getString("ObjectRid")); 
           sub.add(json_child.getString("Name")); 
          } 

         } 
         child.add(sub); 

        } 

       } 
       expListAdapter = new Expandable_list_Adapter(getBaseContext(), 
         groupNames, child); 
       setListAdapter(expListAdapter); 
       Log.e("size in error", "son " + json.length()); 
      } catch (JSONException e) { 
       Log.e("", "", e); 
       Toast.makeText(getBaseContext(), "parsing error", 
         Toast.LENGTH_LONG).show(); 
      } 
      Log.e("sizeof list", ""+sub_id.size()); 
      Iterator itr=objrid.iterator(); 


      while(itr.hasNext()){ 
       Log.e("id","value "+itr.next()); 
      } 

     } 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 
} 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

} 

}

Grazie a Pallavi, Amit Rai e Photon.

+1

bello vedere risolvere il proprio problema – Trikaldarshi

+0

buon lavoro @Rajiv –

+0

grazie a @Photon e Avi –

1

In realtà che cosa mai il controllo si aggiunge nella lista o griglia che vengono copiati in fase di esecuzione avere lo stesso ID come si dichiara per una al momento della progettazione

per esempio : in voi caso in cui queste sono ChildName, rgb, check1

quindi se avete bisogno di sapere su quale casella di controllo in modo univoco si dovrebbe andare per uno ad uno utilizzando ciclo for

e se si vuole fare qualche cosa perché don fai questo

sul caso di controllo casella di selezione

public void onClickevent(View v) 
{ 
private CheckBox ch = (CheckBox) findViewById(v.getId()); 
    if (ch.IsChecked){ 
    //do some thing 
    } 
} 

o in alternativa si dovrebbe andare con il mio modo aggiungere un campo unico come

<TextView 
     android:id="@+id/txtComp1_ID" 
     android:layout_width="0sp" 
     android:layout_height="40sp" 
     android:textSize="1pt" > 
    </TextView> 

quanto ha larghezza pari a zero in modo che non sia visibile, ma tiene ID di quella riga

ora eseguire un ciclo for per tutti gli elementi nella visualizzazione elenco

findview scatola a controllare e poi trovare suo padre e poi di nuovo il suo bambino (Visualizza testo) che questo campo id Così ora avete id e verificare lo stato di controllo di dialogo come precedente questo modo è possibile ottenere questo

vedi esempio

v = (LinearLayout) findViewById(R.id.LinearNotebookList); 
      TextView _id, ID, Name; 
      for (int i = 0; i < nCount; i++) { 
       v = (LinearLayout) NotebookList.getAdapter().getView(i, null, 
         null); 
       _id = (TextView) v.findViewById(R.id.txt_Notebook_ID); 

       Available = (CheckBox) v 
         .findViewById(R.id.chkboxNotebookAvailable); 
       Display = (CheckBox) v.findViewById(R.id.chkboxNotebookDisplay); 
       Demo = (CheckBox) v.findViewById(R.id.chkboxNotebookDemo); 
       str_id = (String) _id.getText(); 

       if (Available.isChecked()) { 
        strAvailable = "YES"; 
       } else { 
        strAvailable = "NO"; 
       } 
       if (Display.isChecked()) { 
        strDisplay = "YES"; 
       } else { 
        strDisplay = "NO"; 
       } 
       if (Demo.isChecked()) { 
        strDemo = "YES"; 
        } else { 
         strDemo = "NO"; 
        } 
} 

si può cambiare in base alle proprie necessità

+0

ho provato il tuo approccio. ma sto ottenendo solo un id che ho definito in xml. ma devo recuperare il valore delle caselle di controllo sulla voce di menu select. Il problema è dove e come posso ottenere tutte le caselle di controllo di riferimento. –

+0

sì, ti ho detto che avrai sempre l'unico id la mia app sta funzionando bene e il suo miglior metodo per risolvere questo problema dimmi l'approccio che stai applicando qui per farò del mio meglio per risolverlo – Trikaldarshi

1

Basta usare setTag (int) e il metodo getTag() per impostare e ottenere id id dei controlli. come EditText, checkbox etc

+0

no a impostare e ottenere tag non id – Trikaldarshi

1

uso

cb.setId(groupPosition+childPosition); 

per impostare l'ID e per recuperare l'uso:

cb.getId(); 

gruppo posizione posizione + bambino vi darà l'esatta posizione della voce.

e in onClick è possibile ottenere l'ID che era stato impostato durante la creazione della casella di controllo.

+0

dove dovrei aggiungere: cb.setId (groupPosition + childPosition); –

+0

dopo aver creato la casella di controllo "CheckBox cb = (CheckBox) v.findViewById (R.id.check1);" – Pallavi

+0

ok ma nel caso in cui l'id di gruppo sia 1 e l'id di bambino 2 e l'id di gruppo sia 2 e il bambino sia 1 in caso contrario sarebbe un conflitto –

Problemi correlati