可扩展列表视图默认选择

时间:2014-03-28 06:41:19

标签: java android expandablelistview default-value navigation-drawer

我创建了一个导航抽屉,里面有一个可扩展的列表视图。 我希望展开式列表视图展开其中一个组,并在活动打开时默认选择其中一个子组。用户可以根据需要更改选择。

无论我创造什么都不满足我的要求。可扩展列表允许用户选择多个选项。

MainActivity

public class MainActivity extends Activity {
    DrawerLayout mDrawerLayout;
    ExpandableListView mDrawerList;
    ExpandableListAdapter listAdapter;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    private ActionBar mActionBar;

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

        // Action bar with collapse icon for drawer menu===================
        mActionBar = getActionBar();
        mActionBar.setHomeButtonEnabled(true);
        mActionBar.setDisplayHomeAsUpEnabled(false);
        // Action bar with collapse icon for drawer menu===================

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ExpandableListView) findViewById(R.id.left_drawer);

        // preparing list data
        prepareListData();

        listAdapter = new ExpandableListAdapter(this, listDataHeader,
                listDataChild);

        // setting list adapter
        mDrawerList.setAdapter(listAdapter);

        // Listview Group click listener
        mDrawerList.setOnGroupClickListener(new OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                // Toast.makeText(getApplicationContext(),
                // "Group Clicked " + listDataHeader.get(groupPosition),
                // Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        // // Listview Group expanded listener
        // mDrawerList.setOnGroupExpandListener(new OnGroupExpandListener() {
        //
        // @Override
        // public void onGroupExpand(int groupPosition) {
        // Toast.makeText(getApplicationContext(),
        // listDataHeader.get(groupPosition) + " Expanded",
        // Toast.LENGTH_SHORT).show();
        // }
        // });
        //
        // // Listview Group collasped listener
        // mDrawerList.setOnGroupCollapseListener(new OnGroupCollapseListener()
        // {
        //
        // @Override
        // public void onGroupCollapse(int groupPosition) {
        // Toast.makeText(getApplicationContext(),
        // listDataHeader.get(groupPosition) + " Collapsed",
        // Toast.LENGTH_SHORT).show();
        //
        // }
        // });

        // mDrawerList.expandGroup(2);
        // mDrawerList.expandGroup(2, true);

        // Listview on child click listener
        mDrawerList.setOnChildClickListener(new OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {

                mDrawerLayout.closeDrawer(mDrawerList);
                // TODO Auto-generated method stub
                // Toast.makeText(
                // getApplicationContext(),
                // listDataHeader.get(groupPosition)
                // + " : "
                // + listDataChild.get(
                // listDataHeader.get(groupPosition)).get(
                // childPosition), Toast.LENGTH_SHORT)
                // .show();
                 v.setBackgroundColor(Color.BLUE);

                makeAToast("Group: " + groupPosition + " Child: "
                        + childPosition);
                return false;
            }
        });

        // To collapse previously opened group===========
        mDrawerList.setOnGroupExpandListener(new OnGroupExpandListener() {
            int previousItem = -1;

            @Override
            public void onGroupExpand(int groupPosition) {
                if (groupPosition != previousItem)
                    mDrawerList.collapseGroup(previousItem);
                previousItem = groupPosition;
            }
        });
        // To collapse previously opened group===========
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
                mDrawerLayout.closeDrawer(mDrawerList);
            } else {
                mDrawerLayout.openDrawer(mDrawerList);
            }
            break;

        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    /*
     * Preparing the list data
     */
    private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();

        // Adding header data
        listDataHeader.add("Today");

        // Adding child data
        List<String> today = new ArrayList<String>();
        today.add("Tanushree Guha");
        today.add("Prasenjit Roy");
        today.add("Pan Singh Tomar");
        today.add("Milka Singh");
        today.add("Rohit Ramanujan");
        today.add("Ramesh Bhatt");
        today.add("Debjani Brahma");

        listDataHeader.add("Tomorrow");
        List<String> tomorrow = new ArrayList<String>();
        tomorrow.add("Dipanjan Bhowmik");
        tomorrow.add("Sarmistha Sinha");
        tomorrow.add("Pranay Lalwani");
        tomorrow.add("Mohit Shaw");
        tomorrow.add("Lovelace Agarwal");
        tomorrow.add("Tanmay Banerjee");

        listDataHeader.add("Later");
        List<String> later = new ArrayList<String>();
        later.add("Yusuf Khan");
        later.add("Jitendar Sharma");
        later.add("Debashree Roy");
        later.add("Mainak Ghosh");
        later.add("Olivia Gomes");

        listDataChild.put(listDataHeader.get(0), today); // Header, Child data
        listDataChild.put(listDataHeader.get(1), tomorrow);
        listDataChild.put(listDataHeader.get(2), later);
    }

    // method to show toast message
    public void makeAToast(String str) {
        Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.show();
    }
}

activity_main.xml 布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</FrameLayout>

 <!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     The drawer is given a fixed width in dp and extends the full height of
     the container. A solid background is used for contrast
     with the content view. -->
<ExpandableListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="#999999"
    android:dividerHeight="1dp"
    android:background="#ffffff"/>
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>

ExpandableListAdapter 类:

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;

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

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

}

如果需要更多源代码,我会提供。我该怎么做才能满足我的要求?

2 个答案:

答案 0 :(得分:0)

我建议使用适用于Android的SlideExpandableListView:

Screenshot
(那个截图是废话,但你可以猜到动画)

这是该图书馆的官方说明:

  

不满意Android ExpandableListView Android提供的?想要像Spotify应用程序那样的东西。此库允许您拥有自定义列表视图,每个列表项都有一个区域,一旦用户点击某个按钮就会滑出。

     

功能

     
      
  • 提供可用于普通ListView的
  • 的更好的ExpandableListView   
  • 默认设置动画
  •   
  • 易于使用
  •   

在GitHub上检查该存储库:https://github.com/tjerkw/Android-SlideExpandableListView/

答案 1 :(得分:0)

问题的第一部分:

  

我希望expandable listview扩展其中一个组并选择   默认情况下,当活动打开时,其子项之一

mExpandableListView.setSelectedChild(groupPosition, childPosition, shouldExpandGroup);

其中:

  1. groupPosition是应首先展开的组的位置
  2. 默认情况下应选择的孩子的位置*以下更多信息
  3. shouldExpandGroup是一个布尔值,应设置为true以展开组
  4. 以上2的信息。

    1. 维护一个包含用户选择的组位置和子位置的hashmap,如:

      HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
      map.put(groupPosition, childPosition);
      
    2. 对于每个子选择只需将其放入hashmap中,如果存在,它将覆盖该值

    3. 将此hashmap存储在文件中或您可以再次访问它的位置(可能是共享首选项但不允许存储对象)

    4. 当活动开始从hashmap获取值并设置选择时, 您可以为所有组设置选择,但对所有组使用shouldExpand为false 除了第一个。如果地图为空,则将默认选择设置为0。