几乎每一个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>
数据填充的代码:
@Override public 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); } // 生成适配器,数组===》ListItem SimpleAdapter mSchedule = new SimpleAdapter(this, // 没什么解释 mylist,// 数据来源 R.layout.my_listitem,// ListItem的XML实现 // 动态数组与ListItem对应的子项 new String[] { "ItemTitle", "ItemText" }, // ListItem的XML文件里面的两个TextView ID new 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; @Override public 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; } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // 没有子类别的Item if (!nodesCount.get(position).isHasChild()) { Toast.makeText(this, "没有子类别", 2000).show(); return; } // 可以展开的Item if (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 {// 已经展开的Item nodesCount.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(); } }