Android 高级控件(二)
16lz
2021-01-23
一: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); }
更多相关文章
- Android四大布局之表格布局行列位置控制
- Android Studio之工程中导入jni库方法
- Android取消EditText自动聚焦、自动弹出输入法的方法
- 转-Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法
- 从零开始学android开发-布局中 layout_gravity、gravity、orient
- Android IPC机制(二):AIDL的基本使用方法
- 在PC端进行android截屏的多种方法
- [置顶] android 自定义控件