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

原创粉丝点击