一:ExpandableListView可扩展列表组件

在日常开发,有可能会遇到需要一些可以展开的列表,学过了jQuery都知道,jQuery很方便的就做出来了。但是,用Android的该怎么做呢?其实在我没有接触过ExpandableListView类之前,都是自定义控件继承于ListView的。然后,后来发现了Android也给我们提供了ExpandableListView类,极大的方便了我们开发;

1、该项目的布局文件非常简单,和ListView差不多,此处就不贴出代码了。

2、ExpandableListViewActivity.java关键代码如下:

private ExpandableListView eab_lv;    private Map> map = new HashMap<>();    private String[] parentList = new String[]{"first", "second", "third"};    private List childrenList1 = new ArrayList<>();    private List childrenList2 = new ArrayList<>();    private List childrenList3 = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_eab_lv);        eab_lv = (ExpandableListView) findViewById(R.id.eab_lv);        //添加数据        childrenList1.add(parentList[0] + "-" + "first");        childrenList1.add(parentList[0] + "-" + "second");        childrenList1.add(parentList[0] + "-" + "third");        childrenList2.add(parentList[1] + "-" + "first");        childrenList2.add(parentList[1] + "-" + "second");        childrenList2.add(parentList[1] + "-" + "third");        childrenList3.add(parentList[2] + "-" + "first");        childrenList3.add(parentList[2] + "-" + "second");        childrenList3.add(parentList[2] + "-" + "third");        map.put(parentList[0], childrenList1);        map.put(parentList[1], childrenList2);        map.put(parentList[2], childrenList3);        eab_lv.setAdapter(new MyExpandableListViewAdapter());    }    class MyExpandableListViewAdapter extends BaseExpandableListAdapter{        //  获得某个父项的某个子项        @Override        public Object getChild(int groupPosition, int childPosition) {            return null;        }        //  获得父项的数量        @Override        public int getGroupCount() {            return map.size();        }        //  获得某个父项的子项数目        @Override        public int getChildrenCount(int parentPos) {            return map.get(parentList[parentPos]).size();        }        //  获得某个父项        @Override        public Object getGroup(int parentPos) {            return map.get(parentList[parentPos]);        }        //  获得某个父项的id        @Override        public long getGroupId(int parentPos) {            return parentPos;        }        //  获得某个父项的某个子项的id        @Override        public long getChildId(int parentPos, int childPos) {            return childPos;        }        //  按函数的名字来理解应该是是否具有稳定的id,这个方法目前一直都是返回false,没有去改动过        @Override        public boolean hasStableIds() {            return false;        }        //  获得父项显示的view        @Override        public View getGroupView(int parentPos, boolean b, View view, ViewGroup viewGroup) {//            getGroupView方法先判断view是否为空,如果view不为空,说明已经加载过一次parent_item布局,//            因此不需要重复加载以提高效率。如果view为空,那么使用如下方法加载parent_item布局:            if(view==null){                LayoutInflater inflater= (LayoutInflater) EabLvActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);                view=inflater.inflate(R.layout.parent_item,null);            }            //如果是父项,就设置R.layout.parent_item为第几个父项,设置R.layout.child_item为-1。如果是子项,就设置R.layout.parent_item属于第几个父项,            // 设置R.layout.child_item为该父项的第几个子项,这样就可以区分被长按的是父项还是子项了。            view.setTag(R.layout.parent_item,parentPos);            view.setTag(R.layout.child_item,-1);            TextView text = (TextView) view.findViewById(R.id.parent_title);            text.setText(parentList[parentPos]);            return view;        }        //  获得子项显示的view        @Override        public View getChildView(final int parentPos, final int childPos, boolean b, View view, ViewGroup viewGroup) {            if(view==null){                LayoutInflater inflater= (LayoutInflater) EabLvActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);                view=inflater.inflate(R.layout.child_item,null);            }            //这里用到了view的setTag方法,一共设置了两个Tag,标签虽然在设置的时候提示说只要int类型即可,但一开始使用0和1来做tag的时候,            // 显示没有报错,但编译运行就报错了,要求是资源文件的id才行,因此换成了R.layout.parent_item和R.layout.child_item。            view.setTag(R.layout.parent_item,parentPos);            view.setTag(R.layout.child_item,childPos);            TextView text = (TextView) view.findViewById(R.id.child_title);            text.setText(map.get(parentList[parentPos]).get(childPos));            text.setOnClickListener(new View.OnClickListener() {                //为子项添加点击的监听事件                @Override                public void onClick(View v) {                    Toast.makeText(EabLvActivity.this, map.get(parentList[parentPos]).get(childPos), Toast.LENGTH_SHORT).show();                }            });            return view;        }        //如果在子项中对某个控件设置了监听器,这个控件要注意不能铺满整个子项,所以在设置高度和宽度时要特别注意,否则设置了子项的监听器也是没有用的        //  子项是否可选中,如果需要设置子项的点击事件,需要返回true        @Override        public boolean isChildSelectable(int i, int i1) {            return false;        }

二:XListView

XListview是一个非常受欢迎的下拉刷新控件,但是已经停止维护了。
这里简单介绍一下它的使用方法:

xml布置控件:

.maxwin.view.XListView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/x_xl"        >.maxwin.view.XListView>

activity:

//创建适配器    private ArrayList items = new ArrayList();//创建XListView对象    //这个是本例中模拟的数据    private Handler mHandler;    //用来模拟网络请求的(不要被迷惑)    private int start = 0;    private static int refreshCnt = 0;    private ArrayAdapter mAdapter;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_xlist_view);        xl_lv = (XListView) findViewById(R.id.x_xl);// ~~~~~指定布局中的xListView控件~~~~~        geneItems();        //用模拟的数据填充系统的adapter        mAdapter = new ArrayAdapter(this, R.layout.list_item, items);        xl_lv.setAdapter(mAdapter);//指定adapter        xl_lv.setPullLoadEnable(true);        xl_lv.setPullRefreshEnable(true);//下拉刷新        xl_lv.setXListViewListener(this);//给xListView设置监听 ******//给xListView条目设置监听事件        mHandler = new Handler();    }    private void geneItems() {        for (int i = 0; i != 5; ++i) {            items.add(0,"refresh cnt"+(++start));        }    }    //获得数据后一定要加onLoad()方法,否则刷新会一直进行,根本停不下来    private void onLoad() {        xl_lv.stopRefresh();        xl_lv.stopLoadMore();        xl_lv.setRefreshTime("刚刚");    }    @Override    public void onRefresh() {        Toast.makeText(this, "11", Toast.LENGTH_SHORT).show();        mHandler.postDelayed(new Runnable() {            @Override            public void run() {                start = ++refreshCnt;                geneItems();// mAdapter.notifyDataSetChanged();                mAdapter = new ArrayAdapter(XListViewActivity.this, R.layout.list_item, items);                xl_lv.setAdapter(mAdapter);                onLoad();            }        }, 2000);    }    @Override    public void onLoadMore() {        Toast.makeText(this, "22", Toast.LENGTH_SHORT).show();        mHandler.postDelayed(new Runnable() {            @Override            public void run() {                geneItems();                mAdapter.notifyDataSetChanged();                onLoad();            }        }, 2000);    }

更多相关文章

  1. Android四大布局之表格布局行列位置控制
  2. Android Studio之工程中导入jni库方法
  3. Android取消EditText自动聚焦、自动弹出输入法的方法
  4. 转-Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法
  5. 从零开始学android开发-布局中 layout_gravity、gravity、orient
  6. Android IPC机制(二):AIDL的基本使用方法
  7. 在PC端进行android截屏的多种方法
  8. [置顶] android 自定义控件

随机推荐

  1. Android(安卓)Update Engine分析(五)服务端
  2. Android(安卓)Fragment与Fragment之间数
  3. 今日头条屏幕适配_工具类
  4. Animation介绍
  5. android gradle 4.1以上依赖的改变:compil
  6. TypedArray和attrs.xml
  7. Android(安卓)DataBinding+ViewModel+Liv
  8. asmack杂记
  9. 在android工程中导入jar包或lib
  10. android网卡调试命令