android 常用的listview管理示例

来源:互联网 发布:递归算法迷宫问题 编辑:程序博客网 时间:2024/06/01 09:27

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;//编辑,显示选择的checkboxprivate boolean mbStatueShow = false;// private arr@Overrideprotected 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{@Overridepublic 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);}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}}@Overridepublic 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布局文件就不贴了,有兴趣下载源码。不用下载积分的。
源码地址:下载

3 0
原创粉丝点击