Android中的可扩展列表视图:编辑特定的子/视图问题

时间:2015-10-25 18:55:14

标签: android expandablelistview edit

经过几天的挫折并接近解决问题之后,我从未真正成功地做到这一点。我的想法是在onChildClick方法中编辑特定子项的颜色(和其他属性)。对于这个例子,我使用的是TextView(但我也想使用一个expandablelistview的复选框并控制一个孩子的Checked状态。)

适配器是这样的:

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


}

主要活动部分:

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

好的,那么: v.setBackgroundColor(Color.BLUE); 会发生什么?我收到以下行为:

当我点击一个孩子时,它会变成蓝色,但在另一个类别中,另一个孩子(看起来几乎是随机的)变成蓝色!

如何编辑只有被按下的孩子的属性,以便用户知道他按下了什么,

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以参考以下逻辑:

/* 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);
                }
            }
        }
    }

然后在onCreate内,您可以使用以下内容:

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

希望这有帮助!