6

Zajmuję się Expandablelistview w systemie Android.Android: getChild() EditText wartości na przycisku kliknij ExpandableListView

W GroupView ma tylko tytuł, a każda grupa ma inny ChildView.

Ten kod działa poprawnie i mogę wyświetlać różne obiekty ChildView w każdym elemencie grupy.

W aplikacji ChildView mam EditText i po kliknięciu przycisku done chcę uzyskać wszystkie wartości EditText i Spinner, które są wejściami użytkownika.

Po kliknięciu na przycisk zrobione w tym czasie, chcę uzyskać szczegóły, które są wypełnione przez użytkownika w pozycji Grupy CustomerLocation itp

Na przykład: obraz pokazany na pytanie. Chcę uzyskać dane wejściowe, które są wypełniane przez użytkownika w elemencie grupy vehicle i TEST.

Potrzebuję pomocy, chcę uzyskać wartości, które są wypełniane przez użytkownika w każdym dziecku EditText.

Oto mój kod:

MainActivity.java

public class MainActivity extends Activity { 

    Context mContext; 
    private ExpandableListView mExpandableListView; 
    CustomAdapter mCustomAdapter; 

    ArrayList<String> newCalibration = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mContext = MainActivity.this; 

     newCalibration.add("CUSTOMER"); 
     newCalibration.add("LOCATION"); 
     newCalibration.add("VEHICLE"); 
     newCalibration.add("TEST"); 
     newCalibration.add("ABC"); 

     /* genarate data for list view */ 
     // genarateData(); 
     /* instantiate adapter with our item list */ 
     mCustomAdapter = new CustomAdapter(mContext, newCalibration); 
     /* we get list view */ 
     mExpandableListView = (ExpandableListView) findViewById(R.id.explist_tools); 
     /* set adapter to list view */ 
     mExpandableListView.setAdapter(mCustomAdapter); 

     mExpandableListView 
       .setOnGroupExpandListener(new OnGroupExpandListener() { 

        int previousGroup = -1; 

        @Override 
        public void onGroupExpand(int groupPosition) { 
         // TODO Auto-generated method stub 
         if (groupPosition != previousGroup) { 
          mExpandableListView.collapseGroup(previousGroup); 
          previousGroup = groupPosition; 
         } 
        } 
       }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

CustomAdapter.java

public class CustomAdapter extends BaseExpandableListAdapter { 

    private LayoutInflater layoutInflater; 

    /* list of parent */ 
    private ArrayList<String> mParents; 

    public CustomAdapter(Context context, ArrayList<String> parents) { 
     super(); 
     this.mParents = parents; 
     layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public Object getChild(int parentPosition, int childPosition) { 
     return null; 
    } 

    @Override 
    public long getChildId(int parentPosition, int childPosition) { 
     // TODO Auto-generated method stub 
     return childPosition; 
    } 

    @Override 
    public View getChildView(int parentPosition, int childPosition, boolean b, 
      View convertView, ViewGroup viewGroup) { 
     if (convertView == null) { 
      convertView = layoutInflater 
        .inflate(R.layout.list_item_child, null); 

     } 
     EditText mEdTxt_1 = (EditText) convertView.findViewById(R.id.edtxt_1); 
     EditText mEdTxt_2 = (EditText) convertView.findViewById(R.id.edtxt_2); 
     EditText mEdTxt_3 = (EditText) convertView.findViewById(R.id.edtxt_3); 
     EditText mEdTxt_4 = (EditText) convertView.findViewById(R.id.edtxt_4); 
     EditText mEdTxt_5 = (EditText) convertView.findViewById(R.id.edtxt_5); 
     RelativeLayout relativeLayout = (RelativeLayout) convertView 
       .findViewById(R.id.relativeLayout); 
     mEdTxt_1.setVisibility(View.VISIBLE); 
     mEdTxt_2.setVisibility(View.VISIBLE); 
     mEdTxt_3.setVisibility(View.VISIBLE); 
     mEdTxt_4.setVisibility(View.VISIBLE); 
     mEdTxt_5.setVisibility(View.VISIBLE); 
     relativeLayout.setVisibility(View.VISIBLE); 

     if (mParents.get(parentPosition).equals("CUSTOMER")) { 
      mEdTxt_4.setVisibility(View.GONE); 
      mEdTxt_5.setVisibility(View.GONE); 
      relativeLayout.setVisibility(View.GONE); 
     } else if (mParents.get(parentPosition).equals("LOCATION")) { 
      mEdTxt_4.setVisibility(View.GONE); 
      mEdTxt_5.setVisibility(View.GONE); 
      relativeLayout.setVisibility(View.GONE); 
     } else if (mParents.get(parentPosition).equals("VEHICLE")) { 
      relativeLayout.setVisibility(View.GONE); 
     } else if (mParents.get(parentPosition).equals("TAXIMETER/BCT")) { 
      mEdTxt_3.setVisibility(View.GONE); 
      mEdTxt_4.setVisibility(View.GONE); 
      mEdTxt_5.setVisibility(View.GONE); 
     } else if (mParents.get(parentPosition).equals("TIRE SPECS")) { 
      mEdTxt_4.setVisibility(View.GONE); 
      mEdTxt_5.setVisibility(View.GONE); 
      relativeLayout.setVisibility(View.GONE); 
     } 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int parentPosition) { 
     return 1; 
    } 

    @Override 
    public Object getGroup(int parentPosition) { 
     // TODO Auto-generated method stub 
     return mParents.get(parentPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     // TODO Auto-generated method stub 
     return mParents.size(); 
    } 

    @Override 
    public long getGroupId(int parentPosition) { 
     // TODO Auto-generated method stub 
     return parentPosition; 
    } 

    @Override 
    public View getGroupView(int parentPosition, boolean isExpanded, 
      View convertView, ViewGroup viewGroup) { 
     TextView groupName = null; 
     String parent = (String) getGroup(parentPosition); 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.list_item_parent, 
        null); 
     } 
     groupName = (TextView) convertView.findViewById(R.id.txt_parentname); 
     groupName.setText(parent); 
     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public boolean isChildSelectable(int i, int i1) { 
     return true; 
    } 

} 

list_item_child.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/item_child" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText 
     android:id="@+id/edtxt_1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:inputType="text" /> 

    <EditText 
     android:id="@+id/edtxt_2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:inputType="text" /> 

    <EditText 
     android:id="@+id/edtxt_3" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:inputType="text" /> 

    <EditText 
     android:id="@+id/edtxt_4" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:inputType="text" /> 

    <EditText 
     android:id="@+id/edtxt_5" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:inputType="text" /> 

    <RelativeLayout 
     android:id="@+id/relativeLayout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <RadioGroup 
      android:id="@+id/radio_group" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" > 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:checked="true" 
       android:text="Radio 1" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Radio 2" /> 
     </RadioGroup> 

     <TextView 
      android:id="@+id/txt_childname" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_below="@+id/radio_group" 
      android:text="TaxiMeter ?" 
      android:textAppearance="?android:attr/textAppearanceSmall" /> 

     <Switch 
      android:id="@+id/switch1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/radio_group" 
      android:text="Switch" /> 
    </RelativeLayout> 

</LinearLayout> 

Obrazy: enter image description here

enter image description here

Dzięki!

+0

hej, masz odpowiedź? –

Odpowiedz

1

Nie będzie można przejść przez listę i uzyskać wartości bezpośrednio z widoków, co prawdopodobnie było planowane.

Zamiast tego po prostu śledź wartości wprowadzane przez użytkownika. W adapterze lub działaniu można zachować haszowaną mapę nazwy pola -> wartość. Za każdym razem, gdy użytkownik zmienia wartość w polu, zaktualizuj to pole o nową wartość w mapie mieszającej. Kiedy naciśniesz przycisk, możesz wykonać iterację na mapie, aby uzyskać listę wszystkich pól, które użytkownik zmienił, oraz wartości, na które je zmienili.

Aby uzyskać wartości pola, gdy użytkownik zmienia je, należy użyć TextWatcher:

myEditText.addTextChangedListener(new TextWatcher() { 
    ... 
    @Override 
    onTextChanged(CharSequence newText, int start, int before, int count) { 
     myMapOfFieldsToValues.set(myFieldName, newText); 
    } 
} 

Można dodać, że do getChildView w adapterze. Możesz wyprowadzić myFieldName z pozycji rodzica i dziecka.

+0

hej, ale jeśli mam dwie takie same wartości dla różnych edittext niż jak możemy dowiedzieć się, która wartość pozycji jest zmiana dla edittext – Mahesh

+0

Musisz tylko użyć dwóch różnych kluczy w twojej mapie. Prawdopodobnie nie będziesz mieć dwóch tekstów do edycji dla tej samej nazwy pola.Jeśli to zrobisz, zawsze możesz wpisać swoją mapę na pozycję. –