现在的位置: 首页 > 综合 > 正文

也谈Android的ListView

2018年04月19日 ⁄ 综合 ⁄ 共 8122字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.