几乎每一个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();
}
}