2012-04-11 17 views
5

Mam rozszerzony widok listy, które mają pola wyboru w węzłach nadrzędnych, a także elementach potomnych. wszystkie dane pochodzą z usługi internetowej, więc jej dynamika.Jak uzyskać identyfikator pól wyboru w widoku rozszerzonej listy?

Obraz załączeniu:

enter image description here

Teraz na pozycji menu kliknij chcę pobrać cały stan pola wyboru. proszę wskazać mi, w jaki sposób mogę uzyskać identyfikator pól używanych w nim.

kod dołączony:

/** 
* 
*/ 


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

      } 
     } 

    } 

A adapter klasa:

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 jest taka sama jak dziecko.

Proszę, poprowadź mnie, jak mogę uzyskać identyfikatory because, ponieważ w wybranym punkcie menu muszę wykonywać podstawowe czynności.

Edytuj: próbuję ustawić setTag() i getTag(). ale teraz rozwijany widok listy pokazuje dziwne zachowanie. kiedy zaznaczam pole wyboru i rozwijam kolejną grupę, wszystkie pola chekbok są ustawione domyślnie. Co muszę zrobić w tym przypadku. nie znam odpowiedzi, dlaczego nie ratuje ona stanu. jestem faceing sam problem jak Strange behaviour in Expandablelistview - Android Plz poprowadzi

Odpowiedz

1

w końcu rozwiązał mój problem. klasa adaptera:

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

} 

} 

i aktywność klasa:

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 

} 

}

Dzięki Pallavi Amit Rai i Photon.

+1

dobrze widzieć, jak rozwiązać swój problem – Trikaldarshi

+0

Dobra robota @Rajiv –

+0

thanks @Photon and Avi –

1

Właściwie co kiedykolwiek kontrolować dodasz na listy lub siatki, które są skopiowane w czasie wykonywania mają ten sam identyfikator jak zadeklarować dla jednego w czasie projektowania

EG w ty przypadku są to nazwa elementu potomnego, RGB, Check1

więc jeśli trzeba wiedzieć o których pole jednoznacznie należy udać się do jednego po drugim za pomocą pętli for

a jeśli chcesz zrobić kilka rzeczy, dlaczego don Zrobisz to

na check box kliknij zdarzenie

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

lub alternatywnie należy udać się z moim sposób dodać unikalny pole jak

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

ponieważ ma zerową szerokość więc nie jest widoczny, ale trzyma id tego wiersza

teraz uruchom pętlę for dla wszystkich elementów w widoku listy

findview pole wyboru masz, a następnie znaleźć jego rodzica, a następnie ponownie swoje dziecko (zobacz tekst), które to pole id więc teraz masz identyfikatora i sprawdzić stan Pole wyboru jak poprzedniego ten sposób można uzyskać to

Zobacz przykład

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

można go zmieniać w zależności od potrzeb

+0

Próbowałem Twojego podejścia. ale otrzymuję tylko jeden identyfikator, co zdefiniowałem w xml. ale muszę pobrać wartość pól wyboru przy wyborze pozycji menu. Problem polega na tym, gdzie i jak mogę uzyskać wszystkie odwołania do pól wyboru. –

+0

Tak, powiedziałem Ci, że zawsze dostaniesz jedyny identyfikator moja aplikacja działa dobrze, a jej najlepsza metoda rozwiązania tego problemu podpowiedz mi, do czego chcesz się zgłosić, postaram się jak najlepiej go rozwiązać – Trikaldarshi

1

Wystarczy użyć setTag (int) i metoda getTag(), aby ustawić identyfikator i uzyskać identyfikator kontroli. jak EditText, wyboru itp

+0

nie można ustawić i pobrać znaczników, a nie id – Trikaldarshi

1

użycie

cb.setId(groupPosition+childPosition); 

ustawić identyfikator i odzyskać użycie: pozycja + dziecko

cb.getId(); 

grupa pozycja daje dokładną pozycję elementu.

i w onClick możesz uzyskać identyfikator, który ustawiłeś podczas tworzenia pola wyboru.

+0

gdzie powinienem dodać: cb.setId (groupPosition + childPosition); –

+0

po utworzeniu pola wyboru "CheckBox cb = (CheckBox) v.findViewById (R.id.check1);" – Pallavi

+0

ok, ale w przypadku, gdy identyfikator grupy to 1 i identyfikator dziecka id 2 , a identyfikator grupy to 2, a dziecko to 1 w przypadkach, w których byłby to konflikt, –

Powiązane problemy