简体   繁体   中英

Expandable List View in Android: edit specific child/view issue

after days of frustration and getting close to solving the problem, I never really managed to do it. My idea is to edit the color (and other properties) of a specific child int the onChildClick method. For this example I was using a TextView (but I also wanted to use an expandablelistview of checkboxes and control the Checked state of a child).

The adapter is so:

    package org.ksinstitute.arsenieboca;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    //ArrayList<ArrayList<Integer>> check_states = new ArrayList<ArrayList<Integer>>();


    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        //or CheckBox
        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);


        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

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

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }


}

And the main activity part:

    expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
                View _lastColored;
                @Override
                public boolean onChildClick(ExpandableListView parent, View v,
                                            int groupPosition, int childPosition, long id) {
                    Toast.makeText(
                            getApplicationContext(),
                            listDataHeader.get(groupPosition)
                                    + " : "
                                    + listDataChild.get(
                                    listDataHeader.get(groupPosition)).get(
                                    childPosition)
                                    + ", "
                                    + groupPosition + "." + childPosition + "\n"
                                    + "id=" + (int)id, Toast.LENGTH_SHORT)
                            .show();

                    **v.setBackgroundColor(Color.BLUE);**

                    listAdapter.notifyDataSetChanged();


                    return false;
                }
            });

Ok, so what happens with the: v.setBackgroundColor(Color.BLUE); ? I am getting the following behavior:

When I click a child, it turns itself into blue, but in each other category another child (seems like almost random) turns blue!

How can I edit the property of ONLY the pressed child, so the user knows what he pressed,

Thank you!

You can refer to the following logic:

/* The click listner for ListView in the navigation drawer */
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            // selected item's color (semi-transparent)
            for (int i = 0; i < parent.getChildCount(); i++) {
                if (position == i) {
                    parent.getChildAt(i).setBackgroundColor(Color.parseColor("#66868686"));
                } else {
                    parent.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
                }
            }
        }
    }

Then inside onCreate , you can use the following:

...
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);
    // set up the drawer's list view with items and click listener
    mDrawerList.setAdapter(new ArrayAdapter<>(this, R.layout.drawer_list_item, itemTitles));
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
...

Hope this helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM