Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android : getChild() EditText values on button click in ExpandableListView

I'm developing Expandablelistview in Android.

In the GroupView has only a title and every group has different ChildView.

This code is working fine and i'm able to see different ChildView's in every Group item.

In ChildView i have an EditText and when i click on done button i want to get all EditText and Spinner values which are inputs by user.

When i click on done button at that time, i want to get details which is filled by user in Group items Customer Location etc.

For a example : the image shown in question. I want to get the input details which is filled by user in vehicle and TEST group item.

Please, I need help, i want to get values which is filled by user in every group item child's EditText.

Here is my code :

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>

Images : enter image description here

enter image description here

Thanks!

like image 358
sam_k Avatar asked Jun 13 '13 14:06

sam_k


1 Answers

You aren't going to be able to go through the list and get the values from the views directly, which is probably what you were planning on doing.

Instead, just keep track of the values as the user enters them. You can keep a hash map of field name -> value in your adapter or activity. Every time the user changes a value in a field, update that field with the new value in the hashmap. When they press done, you can iterate over the map to get a list of all the fields the user changed and the values they changed them to.

To get the values of the fields as the user changes them, use a TextWatcher:

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

You can add that to getChildView in your adapter. You can derive myFieldName from the position of the parent and child.

like image 109
Sam Judd Avatar answered Oct 26 '22 01:10

Sam Judd