也谈Android的ListView
来源:互联网 发布:网络电视机顶盒品牌 编辑:程序博客网 时间:2024/06/12 01:01
几乎每一个Android的应用,都会使用到ListView控件,而原生态的ListView很多时间根本不能满足我们的需求,值得庆幸的是,我们可以很方便的重构基本的ListView,来达到我们需要的效果。
ListView是一个列表,所以我们的关注点应该放在每一个列表项上。重构一个ListView一般需要两个大的步骤:为listView中的项添加布局文件和为ListView填充数据。
列表项的布局文件和其他类型的布局文件一模一样,只是作用域是一个单独的列表项。下面是一个简单的布局示例:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent" android:orientation="vertical"android:layout_height="wrap_content" android:id="@+id/MyListItem"android:paddingBottom="3dip" android:paddingLeft="10dip"><TextView android:layout_height="wrap_content"android:layout_width="fill_parent" android:id="@+id/ItemTitle"android:textSize="30dip"></TextView><TextView android:layout_height="wrap_content"android:layout_width="fill_parent" android:id="@+id/ItemText"></TextView></LinearLayout>
数据填充的代码:
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ListView list = (ListView) findViewById(R.id.MyListView);// 生成动态数组,并且转载数据ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();for (int i = 0; i < 30; i++) {HashMap<String, String> map = new HashMap<String, String>();map.put("ItemTitle", "This is Title....."+i);map.put("ItemText", "This is text.....");mylist.add(map);}// 生成适配器,数组===》ListItemSimpleAdapter mSchedule = new SimpleAdapter(this, // 没什么解释mylist,// 数据来源R.layout.my_listitem,// ListItem的XML实现// 动态数组与ListItem对应的子项new String[] { "ItemTitle", "ItemText" },// ListItem的XML文件里面的两个TextView IDnew int[] { R.id.ItemTitle, R.id.ItemText });// 添加并且显示list.setAdapter(mSchedule);}
ListView的高级应用:构建树状控件
布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentTop="true" android:layout_marginRight="6.0dip" /> <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentTop="true" android:layout_toRightOf="@id/icon" android:gravity="center_vertical" android:singleLine="true" android:textAppearance="?android:textAppearanceMedium" android:textColor="#ffffff" /></RelativeLayout>
代码:
package app.imo;import java.util.ArrayList;import java.util.List;import android.app.ListActivity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import app.imo.R;import app.imo.entity.Node;public class TreeView extends ListActivity {private ArrayList<Node> nodesCount = new ArrayList<Node>();private ArrayList<Node> nodes = new ArrayList<Node>();private TreeViewAdapter treeViewAdapter = null;static int i = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initialData();treeViewAdapter = new TreeViewAdapter(this, R.layout.outline, nodesCount);setListAdapter(treeViewAdapter);registerForContextMenu(getListView());}private void initialData() {Node node1 = new Node("01", "总部门1", false, false, "00", 0, false);Node node2 = new Node("02", "总部门2", false, true, "00", 0, false);Node node3 = new Node("03", "总部门3", false, true, "00", 0, false);Node node4 = new Node("04", "部门A", true, false, "02", 1, false);Node node5 = new Node("05", "部门B", true, false, "02", 1, false);Node node6 = new Node("06", "部门C", true, false, "02", 1, false);Node node7 = new Node("07", "部门D", true, false, "02", 1, false);Node node8 = new Node("08", "部门01", true, false, "03", 1, false);Node node9 = new Node("09", "部门02", true, true, "03", 1, false);Node node10 = new Node("10", "小部门1", true, true, "09", 2, false);Node node11 = new Node("11", "小部门2", true, true, "09", 2, false);Node node12 = new Node("12", "A傻逼", true, false, "11", 3, false);Node node13 = new Node("13", "B傻逼", true, false, "11", 3, false);Node node14 = new Node("14", "傻逼1", true, false, "10", 3, false);Node node15 = new Node("15", "傻逼2", true, false, "10", 3, false);Node node16 = new Node("16", "傻逼3", true, false, "10", 3, false);Node node17 = new Node("17", "傻逼4", true, false, "10", 3, false);Node node18 = new Node("18", "傻逼5", true, false, "10", 3, false);Node node19 = new Node("19", "傻逼6", true, false, "10", 3, false);Node node20 = new Node("20", "傻逼6", true, false, "10", 3, false);Node node21 = new Node("21", "傻逼6", true, false, "10", 3, false);Node node22 = new Node("22", "傻逼6", true, false, "10", 3, false);Node node23 = new Node("23", "傻逼6", true, false, "10", 3, false);Node node24 = new Node("24", "傻逼6", true, false, "10", 3, false);Node node25 = new Node("25", "傻逼6", true, false, "10", 3, false);Node node26 = new Node("26", "傻逼6", true, false, "10", 3, false);Node node27 = new Node("27", "傻逼6", true, false, "10", 3, false);Node node28 = new Node("28", "傻逼6", true, false, "10", 3, false);Node node29 = new Node("29", "傻逼6", true, false, "10", 3, false);Node node30 = new Node("30", "傻逼6", true, false, "10", 3, false);nodesCount.add(node1);nodesCount.add(node2);nodesCount.add(node3);nodes.add(node1);nodes.add(node2);nodes.add(node4);nodes.add(node5);nodes.add(node6);nodes.add(node7);nodes.add(node3);nodes.add(node8);nodes.add(node9);nodes.add(node10);nodes.add(node11);nodes.add(node12);nodes.add(node13);nodes.add(node14);nodes.add(node15);nodes.add(node16);nodes.add(node17);nodes.add(node18);nodes.add(node19);nodes.add(node20);nodes.add(node21);nodes.add(node22);nodes.add(node23);nodes.add(node24);nodes.add(node25);nodes.add(node26);nodes.add(node27);nodes.add(node28);nodes.add(node29);nodes.add(node30);}private class TreeViewAdapter extends ArrayAdapter {public TreeViewAdapter(Context context, int textViewResourceId, List objects) {super(context, textViewResourceId, objects);mInflater = LayoutInflater.from(context);mfilelist = objects;mIconCollapse = BitmapFactory.decodeResource(context.getResources(), R.drawable.outline_list_collapse);mIconExpand = BitmapFactory.decodeResource(context.getResources(), R.drawable.outline_list_expand);}private LayoutInflater mInflater;private List<Node> mfilelist;private Bitmap mIconCollapse;private Bitmap mIconExpand;public int getCount() {return mfilelist.size();}public Object getItem(int position) {return position;}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = mInflater.inflate(R.layout.outline, null);holder = new ViewHolder();holder.text = (TextView) convertView.findViewById(R.id.text);holder.icon = (ImageView) convertView.findViewById(R.id.icon);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}Node node = mfilelist.get(position);holder.icon.setPadding(25 * (node.getLevel() + 1), holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom());holder.text.setText(node.getText());if (node.isHasChild() && !node.isExpanded()) {holder.icon.setImageBitmap(mIconCollapse);holder.icon.setVisibility(View.VISIBLE);} else if (node.isHasChild() && node.isExpanded()) {holder.icon.setImageBitmap(mIconExpand);holder.icon.setVisibility(View.VISIBLE);} else if (!node.isHasChild()) {holder.icon.setImageBitmap(mIconCollapse);holder.icon.setVisibility(View.INVISIBLE);}return convertView;}class ViewHolder {TextView text;ImageView icon;}}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);// 没有子类别的Itemif (!nodesCount.get(position).isHasChild()) {Toast.makeText(this, "没有子类别", 2000).show();return;}// 可以展开的Itemif (nodesCount.get(position).isExpanded()) {nodesCount.get(position).setExpanded(false);Node node = nodesCount.get(position);ArrayList<Node> temp = new ArrayList<Node>();for (int i = position + 1; i < nodesCount.size(); i++) {if (node.getLevel() >= nodesCount.get(i).getLevel()) {break;}temp.add(nodesCount.get(i));}nodesCount.removeAll(temp);} else {// 已经展开的ItemnodesCount.get(position).setExpanded(true);int level = nodesCount.get(position).getLevel();int nextLevel = level + 1;for (Node node : nodes) {int j = 1;if (node.getParent() == nodesCount.get(position).getId()) {node.setLevel(nextLevel);node.setExpanded(false);nodesCount.add(position + j, node);j++;}}}treeViewAdapter.notifyDataSetChanged();}}
- 也谈Android的ListView
- ListView 原理的介绍 qt也可以吧想通的Android
- android-在listView即可点checkbox也可点listview
- 【android】让listview的顶部或者底部也显示分割线
- Android基础:listview的item点击事件会使里面的Button也出现按压的效果
- android控件ListView顶部或者底部也显示分割线
- Android中解决ScrollView下拉阴影的问题(ListView也应该可以的,没有亲测)
- 【Android】Glide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载(已修正Listview部分以及排版)
- 也谈Android的学习和利用Android来赚钱
- 也谈Android的学习和利用Android来赚钱
- 也谈Android的学习和利用Android来赚钱
- listView最后一项也显示divider的方法
- ListView当数据库更新的时候,随之也更新问题
- android ListView的使用
- android ListView的美化
- android ListView的使用方法
- Android 水平的ListView
- Android ListView的使用
- 正则表达式
- 条码
- 对上一篇文章《extern与头文件(*.h)的区别和联系》的学习体会
- 页面跳转之前显示等待 wating ------
- 操作系统 第六章 设备管理
- 也谈Android的ListView
- Linux下Tcp/Ip源码导读(一)--IPV4网络分层结构
- 多台linux服务器ssh相互无密码访问
- 操作系统 第七章 作业管理
- 说不懂Android系统构架,太亏了!
- android反編譯命令
- java程序性能优化
- 绘K线图和条形图
- 操作系统 第八章 进程同步与通信