2012-04-11 7 views
5

Tengo una vista de lista ampliada que tiene casillas de verificación en nodos principales, así como elementos secundarios. todos los datos provienen del servicio web por lo que es dinámico.cómo obtener la identificación de las casillas de verificación en el elemento de vista de lista ampliada?

imagen adjunta:

enter image description here

Ahora el elemento de menú haga clic en Deseo a buscar a todos los estados de casilla de verificación. por favor guíame cómo puedo obtener la identificación de las casillas de verificación utilizadas en él.

código adjunto:

/** 
* 
*/ 


    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(); 

      } 
     } 

    } 

Y adaptador de clase:

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 es igual que los niños.

por favor guíame cómo puedo obtener los identificadores de las casillas de verificación porque en el elemento del menú seleccionado tengo que hacer operaciones básicas sobre eso.

Edit: intenté setTag() y getTag(). pero ahora la vista de lista expandible muestra un comportamiento extraño. cuando selecciono una casilla de verificación y expandir otro grupo, todos los cuadros chekbok están configurados por defecto. Lo que tengo que hacer en este caso. No sé por qué no está salvando el estado. YO SOY faceing mismo problema que Strange behaviour in Expandablelistview - Android PLZ guiar

Respuesta

1

finalmente resolví mi problema. clase de adaptador:

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(){ 

} 

} 

Y Clase de actividad:

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 

} 

}

Gracias a pallavi, Rai Amit y fotones.

+1

bueno ver resolver el problema propio – Trikaldarshi

+0

buen trabajo @Rajiv –

+0

gracias @Photon and Avi –

1

En realidad lo que cada vez el control se agrega en la lista o rejilla que se copian en tiempo de ejecución tienen mismo ID que se declara una en el momento del diseño

por ejemplo, : en el que caso de que estos son ChildName, rgb, check1

así que si lo que necesita saber acerca de qué casilla única hay que ir por uno por uno usando bucle for

y si quieres hacer alguna cosa ¿por qué no haces esto

en caso de verificación área de clic

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

o, alternativamente, hay que ir con mi manera añadir un campo único como

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

ya que tiene un ancho de cero por lo que no es visible, pero se mantiene id de esa fila

ahora ejecuta un bucle for para todos los elementos en la vista de lista

findview marca la casilla y luego encontrar su matriz y luego otra vez a su hijo (ver texto) que este campo id por lo que ahora tiene Identificación y comprobar el estado de casilla de verificación que el anterior esta manera se puede conseguir este

Ver ejemplo

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"; 
        } 
} 

puede cambiar de acuerdo a su necesidad

+0

intenté su enfoque. pero obtengo solo una identificación que he definido en xml. pero tengo que buscar el valor de las casillas de verificación en la selección del elemento de menú. El problema es dónde y cómo puedo obtener todas las casillas de verificación de referencia. –

+0

sí, te he dicho que siempre obtendrás la única identificación mi aplicación está funcionando bien y su mejor método para resolver este problema dime el enfoque para el que estás aplicando, intentaré lo mejor para solucionarlo – Trikaldarshi

1

sólo tiene que utilizar el método setTag getTag() (int) y para establecer y obtener ID Identificación de los controles. como EditarTexto, etc casilla

+0

no es para establecer y obtener etiquetas, no el id – Trikaldarshi

1

uso

cb.setId(groupPosition+childPosition); 

para establecer el ID y para recuperar su uso: posición de la posición + niño

cb.getId(); 

grupo le dará la posición exacta del artículo.

y en onClick puede obtener la ID que ha configurado al crear la casilla de verificación.

+0

donde debería agregar: cb.setId (groupPosition + childPosition); –

+0

después de crear la casilla de verificación "CheckBox cb = (CheckBox) v.findViewById (R.id.check1);" – Pallavi

+0

está bien, pero en caso de que el ID del grupo sea 1 y el Id. De identificación del niño 2 y el ID de grupo sea 2 y el hijo sea 1 en los casos sería un conflicto –

Cuestiones relacionadas