码迷,mamicode.com
首页 > 移动开发 > 详细

android 常用的listview管理示例

时间:2016-01-05 21:02:00      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

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布局文件就不贴了,有兴趣下载源码。不用下载积分的。
源码地址:下载

android 常用的listview管理示例

标签:

原文地址:http://blog.csdn.net/qq_16064871/article/details/50464786

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!