Highlight for selected item in expandable list

后端 未结 11 2096
攒了一身酷
攒了一身酷 2021-01-31 21:25

I have a layout where I have an expandable list in a fragment on the left and a details fragment on the right. This all works fine.

Now I would like to indicate what

11条回答
  •  攒了一身酷
    2021-01-31 21:37

    I finally figured out how to make this work (for me). It seems a bit of the hack, but it's the only thing I've managed to get working for this.

    Basically I create a two dimensional array to hold the selected state of the children, initialize it in the adapter constructor, then I reference that in my getChildView method (in case the currently selected child scrolls out of view) and my onChildClick method (to change the current selection and turn off the old one).

    private selectedStatus[][];  // array to hold selected state
    private View oldView;        // view to hold so we can set background back to normal after selection of another view
    

    Constructor initialize the array

        public MyExpandableListAdapter(Cursor cursor, Context context,
                int groupLayout, int childLayout, String[] groupFrom,
                int[] groupTo, String[] childrenFrom, int[] childrenTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo,
                    childLayout, childrenFrom, childrenTo);
            selectedStatus = new boolean[cursor.getCount()][];
            for (int i = 0; i < cursor.getCount(); i++) {
                cursor.moveToPosition(i);
                Cursor childCheckCursor = mDbHelper.fetchChildren(mGroup,
                        cursor.getString(cursor
                                .getColumnIndex(AttendanceDB.EVENT_ROWID)));
                getActivity().startManagingCursor(childCheckCursor);
                selectedStatus[i] = new boolean[childCheckCursor.getCount()];
                for (int j = 0; j < childCheckCursor.getCount(); j++) {
                    selectedStatus[i][j] = false;
                }
            }
    
        }
    

    getChildView needed for when the child scrolls out of view

        @Override 
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
            final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent); 
            if(selectedStatus[groupPosition][childPosition] == true){
                v.setBackgroundResource(R.color.blue);                          
            } else {
                v.setBackgroundResource(R.color.black);
            }
            return v; 
        } 
    

    onChildClick change selected item

        lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                mRowId = id;
                EventDisplayFragment eventdisplay = new EventDisplayFragment();
                getFragmentManager().beginTransaction()
                        .replace(R.id.rightpane, eventdisplay).commit();
                if(oldView != null){
                    oldView.setBackgroundResource(R.color.black);   // change the background of the old selected item back to default black                 }
                oldView = v;                                        // set oldView to current view so we have a reference to change back on  next selection
                for (int i = 0; i < selectedStatus.length; i++) {
                    for (int j = 0; j < checkedStatus[i].length; j++) {
                        if(i == groupPosition && j == childPosition){  // set the current view to true and all others to false
                            selectedStatus[i][j] = true;
                        } else {
                            selectedStatus[i][j] = false;
                        }
                    }
                }
                v.setBackgroundResource(R.color.blue);
                return true;
            }
        });
    

提交回复
热议问题