android 常用的listview管理示例

listview作为一个常用控件,对listview的操作都应该滚瓜烂熟了。对listview 的数据管理也很熟悉。包括listview的单击,双击,多选删除,完成刷新,添加数据等等。我再次对listview的管理操作写了一个demo。里面包含我说的那些部分操作,根据这个demo可以参考实现自已多更能操作。

源码地址:下载

1、实现的效果

2、主要的代码

package com.example.listmanage;

import java.util.ArrayList;
import java.util.LinkedList;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener ,OnCheckedChangeListener {
	class ItemStatus {
		public boolean mIsCheckBoxVisible = false;
		public boolean mIsCheckBoxSelected = false;
	}

	// 记录当前每个工程是否在UI上被选中
	private LinkedList<ItemStatus> mItemsExtendData;
    //listview的数据源
	private ArrayList<String> mList;
	private ListView mListView;
    //适配器
	private ListAdapt mListAdapt;

	private TextView mtextviewShow;
	//编辑或者完成
	private Button mbuttonEdit;

	//编辑,显示选择的checkbox
	private boolean mbStatueShow = false;

	// private arr
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);

		initData();

		initView();
	}

	private void initView() {
		mListView = (ListView) findViewById(R.id.listView1);
		mListAdapt = new ListAdapt(this);
		mListView.setAdapter(mListAdapt);
		ToolUtil.ReCalListViewHeightBasedOnChildren(mListView);

		mListView.setOnItemClickListener(new ListItemonClick());

		mbuttonEdit = (Button)findViewById(R.id.buttonEdit);
		mbuttonEdit.setOnClickListener(this);

		CheckBox cBox = (CheckBox)findViewById(R.id.checkBox1);
		cBox.setOnCheckedChangeListener(this);

		TextView textviewDetele = (TextView)findViewById(R.id.textviewDetele);
		textviewDetele.setOnClickListener(this);

		mtextviewShow = (TextView)findViewById(R.id.textviewShow);
		mtextviewShow.setText("已选" +  String.valueOf(0) +  "项");

		findViewById(R.id.layoutBottom).setVisibility(View.GONE);
		findViewById(R.id.layoutBottomNew).setVisibility(View.VISIBLE);
	}

	private void initData() {
		mList = new ArrayList<String>();
		mList.clear();
		for (int i = 0; i < 25; i++) {
			mList.add("第 " + String.valueOf(i) + " 项");
		}

		InitListViewExtendData();

		SetShowStatus(false);

	}

	//设置每一项是选择checkbox的显示状态
	private void SetShowStatus(Boolean bStatueShow) {
		mbStatueShow = bStatueShow;
		if (mbStatueShow) {
			// 遍历listView的数据源,设置部分控件的隐藏和显示
			for (ItemStatus ItemData : GetItemsExtendData()) {
				ItemData.mIsCheckBoxSelected = false;
				ItemData.mIsCheckBoxVisible = true;
			}
		} else {
			// 遍历listView的数据源,设置部分控件的隐藏和显示
			for (ItemStatus ItemData : GetItemsExtendData()) {
				ItemData.mIsCheckBoxSelected = false;
				ItemData.mIsCheckBoxVisible = false;
			}
		}
		if (mListAdapt != null) {
			//使用listview手动计算高度
			ToolUtil.ReCalListViewHeightBasedOnChildren(mListView);
			mListAdapt.notifyDataSetChanged();
		}
	}

	//listview的单击事件
	private class ListItemonClick implements OnItemClickListener{
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			CheckBox isSelectedCheckBox = (CheckBox)view.findViewById(R.id.checkBox1);
			//处理编辑状态的单击选择
			if (mbStatueShow) {
				if (isSelectedCheckBox != null) isSelectedCheckBox.setChecked(!isSelectedCheckBox.isChecked());
				return;
			}

			Toast.makeText(MainActivity.this, "单击" + String.valueOf(position), Toast.LENGTH_LONG).show();
		}
	}

	//适配器使用的内部类
	class ViewHolder {
		TextView titleTextView;
		CheckBox selectCheckBox;
	}

	class ListAdapt extends BaseAdapter implements OnCheckedChangeListener {
		private Context mContext;
		private LayoutInflater mLayoutInflater;

		public ListAdapt(Context context) {
			mContext = context;
			mLayoutInflater = (LayoutInflater) mContext
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public int getCount() {
			return mList.size();
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder vHolder = null;
			if (convertView == null) {
				vHolder = new ViewHolder();
				convertView = mLayoutInflater.inflate(
						R.layout.activity_main_list_item, null);
				vHolder.titleTextView = (TextView) convertView
						.findViewById(R.id.textView1);
				vHolder.selectCheckBox = (CheckBox) convertView
						.findViewById(R.id.checkBox1);
				convertView.setTag(vHolder);
			} else {
				vHolder = (ViewHolder) convertView.getTag();
			}

			vHolder.titleTextView.setText(mList.get(position));

			if (GetItemsExtendData().size() != 0) {
				ItemStatus itemStatus = GetItemsExtendData().get(position);
				if (itemStatus != null && vHolder.selectCheckBox != null) {
					vHolder.selectCheckBox.setTag(position);
					vHolder.selectCheckBox.setOnCheckedChangeListener(this);
					vHolder.selectCheckBox
							.setVisibility(itemStatus.mIsCheckBoxVisible == true ? View.VISIBLE
									: View.INVISIBLE);
					vHolder.selectCheckBox
							.setChecked(itemStatus.mIsCheckBoxSelected);
				}
			}
			return convertView;
		}

		@Override
		public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
			Integer nPosition = (Integer) (buttonView.getTag());
			GetItemsExtendData().get(nPosition.intValue()).mIsCheckBoxSelected = isChecked;

			// 获取当前的所有选中项个数 -- 如果数据较多的话,不可以这种方式
			int nSelectCount = 0;
			for (ItemStatus ItemData : GetItemsExtendData()) {
				if (ItemData.mIsCheckBoxSelected == true)
					nSelectCount += 1;
			}
			mtextviewShow.setText("已选" +  String.valueOf(nSelectCount) +  "项");
		}

	}

	// 初始化列表的额外数据
	private void InitListViewExtendData() {
		GetItemsExtendData().clear();
		int nItemCount = mList.size();
		for (int i = 0; i < nItemCount; i++) {
			ItemStatus itemData = new ItemStatus();
			GetItemsExtendData().add(itemData);
		}
	}

	private LinkedList<ItemStatus> GetItemsExtendData() {
		if (mItemsExtendData == null)
			mItemsExtendData = new LinkedList<ItemStatus>();
		return mItemsExtendData;
	}

	protected ArrayList<Integer> getRemoveCount() {
		// 获取需要删除的索引数组
		ArrayList<Integer> needRemoveItemsIndexArray = new ArrayList<Integer>();
		for (int i = 0; i < GetItemsExtendData().size(); i++) {
			ItemStatus itemData = GetItemsExtendData().get(i);
			if (itemData.mIsCheckBoxSelected == true)
				needRemoveItemsIndexArray.add(new Integer(i));
		}
		return needRemoveItemsIndexArray;
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.buttonEdit:
			if (mbStatueShow) {
				mbuttonEdit.setText("编辑");
				SetShowStatus(false);
				findViewById(R.id.layoutBottom).setVisibility(View.GONE);
				findViewById(R.id.layoutBottomNew).setVisibility(View.VISIBLE);
			}else {
				SetShowStatus(true);
				mbuttonEdit.setText("完成");
				findViewById(R.id.layoutBottomNew).setVisibility(View.GONE);
				findViewById(R.id.layoutBottom).setVisibility(View.VISIBLE);
			}
			break;
		case R.id.textviewDetele:
			ArrayList<Integer> needRemoveItemsIndexArray = getRemoveCount();

			// 删除指定项
			for (int i = needRemoveItemsIndexArray.size() - 1; i >= 0; i--) {
				mList.remove(needRemoveItemsIndexArray.get(i).intValue());
			}
			InitListViewExtendData();
			SetShowStatus(true);

			break;

		default:
			break;
		}
	}

	@Override
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
		switch (buttonView.getId()) {
		case R.id.checkBox1:
			if (isChecked) {
				for (ItemStatus ItemData : GetItemsExtendData()) {
					ItemData.mIsCheckBoxSelected = true;
					ItemData.mIsCheckBoxVisible = true;
				}
				mtextviewShow.setText("已选" +  String.valueOf(mList.size()) +  "项");
			}else {
				for (ItemStatus ItemData : GetItemsExtendData()) {
					ItemData.mIsCheckBoxSelected = false;
					ItemData.mIsCheckBoxVisible = true;
				}
				mtextviewShow.setText("已选" +  String.valueOf(0) +  "项");
			}
			if (mListAdapt != null) {
				ToolUtil.ReCalListViewHeightBasedOnChildren(mListView);
				mListAdapt.notifyDataSetChanged();
			}
			break;

		default:
			break;
		}

	}
}

3、手动计算listview高度工具类

package com.example.listmanage;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;

public class ToolUtil {

    public static void ReCalListViewHeightBasedOnChildren(ListView listView) {
		if (listView == null) return;
		ListAdapter listAdapter = listView.getAdapter();
		if (listAdapter == null) return;
		int nTotalHeight = 0;
		for (int i = 0; i < listAdapter.getCount(); i++) {
			View listItem = listAdapter.getView(i, null, listView);
			listItem.measure(0, 0);
			nTotalHeight += listItem.getMeasuredHeight();
		}

		ViewGroup.LayoutParams params = listView.getLayoutParams();
		params.height = nTotalHeight + (listView.getDividerHeight()*(listAdapter.getCount()-1));
    }
}

xml布局文件就不贴了,有兴趣下载源码。不用下载积分的。

源码地址:下载

时间: 2024-10-25 17:10:46

android 常用的listview管理示例的相关文章

android 嵌套的listview示例(可参考实现朋友圈评论)

最近在项目中用到listview中再嵌套一个listview,两层也有监听,都没有问题.其实,主要解决里面那一层的listview的高度计算就可以,外面那一层listview自动计算.加上里面那层展开的,就是高度.这种解决方案经常应用于朋友圈的评论.每一条说说,然后下面有评论. 项目下载地址:http://download.csdn.net/detail/qq_16064871/9334993 1.项目结构图 2.实现效果图 这上面效果图的监听两层都有,以及外面的button都可以.够多样化吧.

Android最常用的ListView解决方案大集合

实现以上效果需解决 1选择苹果时并不是所有的苹果都被选中 2解决如果是几千条数据,等大数据带来的程序崩溃问题 3实现添加头部和脚部 4全选和反选 java源码部分 FruitAdapter public class FruitAdapter extends BaseAdapter { private List<Fruit> mFruits; private LayoutInflater Inflater; private boolean[] mManagerAllCheckBox; publi

Android常用组件之ListView

使用ListAdapter是ListView的适配器. 使用ListView.setAdapter()方法来设置ListView的适配器. 简单的使用 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); adapter.add("hello"); adapter.add("eoe"); lv.setAdapter(adapter); R前面的andro

Android常用开源项目

Android常用开源项目 Android   2014-05-23 16:39:43 发布 您的评价:       4.3   收藏     24收藏 Android开源项目第一篇--个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.其他Android开源项目第二篇--工具库篇  包括依赖注入.图片缓存.网络相关.数据库ORM工具包.Android公

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动

Android常用面试题大全

1.TCP和UDP之间的区别?什么是URL ? TCP被称为用户数据报协议;UDP被称为信息传输控制协议;URL被称为统一资源定位符,通过统一资源定位符可以唯一定位到互联网上的某个资源(图片.视频.音频和网页等). 2.成员方法和构造方法有什么区别? 成员方法必须有返回类型,即使是没有返回,也要写上void:构造函数没有返回类型,而且和类名一样. 3.什么是栈? 栈是一种先进后出的线性表,只要符合先进后出的原则的线性表都是栈.至于采用的存储方式(实现方式)是顺序存储(顺序栈)还是链式存储(链式栈

android笔记:ListView及ArrayAdapter

ListView用于展示大量数据,而数据无法直接传递给ListView,需要借助适配器adapter来完成. ArrayAdapter是最常用的adapter,可以通过泛型来指定要适配的数据类型. ArrayAdapter的参数如下: android.widget.ArrayAdapter.ArrayAdapter<String>(Context context, int textViewResourceId, String[] objects) 构造函数的参数解析如下: Context co

Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)

Android UI学习 - ListView 2010-06-20 18:21:35 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://android.blog.51cto.com/268543/336162 ListActivity ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,只要我

.Net程序员玩转Android开发---(12)ListView显示数据

Android中显示数据有多种控件,这节我们来认识下ListView,ListView是Android中最常用的数据显示控件,可以显示简单数据源,也可以显示复杂数据源,我们在Android系统中常看到的列表项,基本都是ListView的功劳.ListView中显示数据,肯定要绑定数据源.数据源的绑定是通过Adapter来完成的,Android中有两种常用的适配器,ArrayAdapter(数组适配器)  SimpleAdapter(简单适配器),适配器的作用就是把复杂的数据源显示到istview