listview 管理示例

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

源码地址:下载

1、实现的效果



2、主要的代码

[java]  view plain copy
  1. package com.example.listmanage;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.LinkedList;  
  5. import android.os.Bundle;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.ViewGroup;  
  12. import android.view.Window;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.BaseAdapter;  
  16. import android.widget.Button;  
  17. import android.widget.CheckBox;  
  18. import android.widget.CompoundButton;  
  19. import android.widget.CompoundButton.OnCheckedChangeListener;  
  20. import android.widget.ListView;  
  21. import android.widget.TextView;  
  22. import android.widget.Toast;  
  23.   
  24. public class MainActivity extends Activity implements OnClickListener ,OnCheckedChangeListener {  
  25.     class ItemStatus {  
  26.         public boolean mIsCheckBoxVisible = false;  
  27.         public boolean mIsCheckBoxSelected = false;  
  28.     }  
  29.   
  30.     // 记录当前每个工程是否在UI上被选中  
  31.     private LinkedList<ItemStatus> mItemsExtendData;  
  32.     //listview的数据源  
  33.     private ArrayList<String> mList;  
  34.     private ListView mListView;  
  35.     //适配器  
  36.     private ListAdapt mListAdapt;  
  37.       
  38.     private TextView mtextviewShow;  
  39.     //编辑或者完成  
  40.     private Button mbuttonEdit;  
  41.   
  42.     //编辑,显示选择的checkbox  
  43.     private boolean mbStatueShow = false;  
  44.   
  45.     // private arr  
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  50.         setContentView(R.layout.activity_main);  
  51.   
  52.         initData();  
  53.   
  54.         initView();  
  55.     }  
  56.   
  57.     private void initView() {  
  58.         mListView = (ListView) findViewById(R.id.listView1);  
  59.         mListAdapt = new ListAdapt(this);  
  60.         mListView.setAdapter(mListAdapt);  
  61.         ToolUtil.ReCalListViewHeightBasedOnChildren(mListView);  
  62.           
  63.         mListView.setOnItemClickListener(new ListItemonClick());  
  64.   
  65.         mbuttonEdit = (Button)findViewById(R.id.buttonEdit);  
  66.         mbuttonEdit.setOnClickListener(this);  
  67.           
  68.         CheckBox cBox = (CheckBox)findViewById(R.id.checkBox1);  
  69.         cBox.setOnCheckedChangeListener(this);  
  70.           
  71.         TextView textviewDetele = (TextView)findViewById(R.id.textviewDetele);  
  72.         textviewDetele.setOnClickListener(this);  
  73.           
  74.         mtextviewShow = (TextView)findViewById(R.id.textviewShow);  
  75.         mtextviewShow.setText("已选" +  String.valueOf(0) +  "项");  
  76.           
  77.         findViewById(R.id.layoutBottom).setVisibility(View.GONE);  
  78.         findViewById(R.id.layoutBottomNew).setVisibility(View.VISIBLE);  
  79.     }  
  80.   
  81.     private void initData() {  
  82.         mList = new ArrayList<String>();  
  83.         mList.clear();  
  84.         for (int i = 0; i < 25; i++) {  
  85.             mList.add("第 " + String.valueOf(i) + " 项");  
  86.         }  
  87.   
  88.         InitListViewExtendData();  
  89.   
  90.         SetShowStatus(false);  
  91.   
  92.     }  
  93.   
  94.     //设置每一项是选择checkbox的显示状态  
  95.     private void SetShowStatus(Boolean bStatueShow) {  
  96.         mbStatueShow = bStatueShow;  
  97.         if (mbStatueShow) {  
  98.             // 遍历listView的数据源,设置部分控件的隐藏和显示  
  99.             for (ItemStatus ItemData : GetItemsExtendData()) {  
  100.                 ItemData.mIsCheckBoxSelected = false;  
  101.                 ItemData.mIsCheckBoxVisible = true;  
  102.             }  
  103.         } else {  
  104.             // 遍历listView的数据源,设置部分控件的隐藏和显示  
  105.             for (ItemStatus ItemData : GetItemsExtendData()) {  
  106.                 ItemData.mIsCheckBoxSelected = false;  
  107.                 ItemData.mIsCheckBoxVisible = false;  
  108.             }             
  109.         }  
  110.         if (mListAdapt != null) {  
  111.             //使用listview手动计算高度  
  112.             ToolUtil.ReCalListViewHeightBasedOnChildren(mListView);  
  113.             mListAdapt.notifyDataSetChanged();  
  114.         }  
  115.     }  
  116.       
  117.     //listview的单击事件  
  118.     private class ListItemonClick implements OnItemClickListener{  
  119.         @Override  
  120.         public void onItemClick(AdapterView<?> parent, View view, int position,  
  121.                 long id) {  
  122.             CheckBox isSelectedCheckBox = (CheckBox)view.findViewById(R.id.checkBox1);  
  123.             //处理编辑状态的单击选择  
  124.             if (mbStatueShow) {  
  125.                 if (isSelectedCheckBox != null) isSelectedCheckBox.setChecked(!isSelectedCheckBox.isChecked());  
  126.                 return;  
  127.             }  
  128.               
  129.             Toast.makeText(MainActivity.this"单击" + String.valueOf(position), Toast.LENGTH_LONG).show();  
  130.         }  
  131.     }  
  132.   
  133.     //适配器使用的内部类  
  134.     class ViewHolder {  
  135.         TextView titleTextView;  
  136.         CheckBox selectCheckBox;  
  137.     }  
  138.   
  139.     class ListAdapt extends BaseAdapter implements OnCheckedChangeListener {  
  140.         private Context mContext;  
  141.         private LayoutInflater mLayoutInflater;  
  142.   
  143.         public ListAdapt(Context context) {  
  144.             mContext = context;  
  145.             mLayoutInflater = (LayoutInflater) mContext  
  146.                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  147.         }  
  148.   
  149.         @Override  
  150.         public int getCount() {  
  151.             return mList.size();  
  152.         }  
  153.   
  154.         @Override  
  155.         public Object getItem(int position) {  
  156.             return position;  
  157.         }  
  158.   
  159.         @Override  
  160.         public long getItemId(int position) {  
  161.             return 0;  
  162.         }  
  163.   
  164.         @Override  
  165.         public View getView(int position, View convertView, ViewGroup parent) {  
  166.             ViewHolder vHolder = null;  
  167.             if (convertView == null) {  
  168.                 vHolder = new ViewHolder();  
  169.                 convertView = mLayoutInflater.inflate(  
  170.                         R.layout.activity_main_list_item, null);  
  171.                 vHolder.titleTextView = (TextView) convertView  
  172.                         .findViewById(R.id.textView1);  
  173.                 vHolder.selectCheckBox = (CheckBox) convertView  
  174.                         .findViewById(R.id.checkBox1);  
  175.                 convertView.setTag(vHolder);  
  176.             } else {  
  177.                 vHolder = (ViewHolder) convertView.getTag();  
  178.             }  
  179.   
  180.             vHolder.titleTextView.setText(mList.get(position));  
  181.   
  182.             if (GetItemsExtendData().size() != 0) {  
  183.                 ItemStatus itemStatus = GetItemsExtendData().get(position);  
  184.                 if (itemStatus != null && vHolder.selectCheckBox != null) {  
  185.                     vHolder.selectCheckBox.setTag(position);  
  186.                     vHolder.selectCheckBox.setOnCheckedChangeListener(this);  
  187.                     vHolder.selectCheckBox  
  188.                             .setVisibility(itemStatus.mIsCheckBoxVisible == true ? View.VISIBLE  
  189.                                     : View.INVISIBLE);  
  190.                     vHolder.selectCheckBox  
  191.                             .setChecked(itemStatus.mIsCheckBoxSelected);  
  192.                 }  
  193.             }  
  194.             return convertView;  
  195.         }  
  196.   
  197.         @Override  
  198.         public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {  
  199.             Integer nPosition = (Integer) (buttonView.getTag());  
  200.             GetItemsExtendData().get(nPosition.intValue()).mIsCheckBoxSelected = isChecked;  
  201.               
  202.             // 获取当前的所有选中项个数 -- 如果数据较多的话,不可以这种方式  
  203.             int nSelectCount = 0;  
  204.             for (ItemStatus ItemData : GetItemsExtendData()) {  
  205.                 if (ItemData.mIsCheckBoxSelected == true)  
  206.                     nSelectCount += 1;  
  207.             }  
  208.             mtextviewShow.setText("已选" +  String.valueOf(nSelectCount) +  "项");  
  209.         }  
  210.   
  211.     }  
  212.   
  213.     // 初始化列表的额外数据  
  214.     private void InitListViewExtendData() {  
  215.         GetItemsExtendData().clear();  
  216.         int nItemCount = mList.size();  
  217.         for (int i = 0; i < nItemCount; i++) {  
  218.             ItemStatus itemData = new ItemStatus();  
  219.             GetItemsExtendData().add(itemData);  
  220.         }  
  221.     }  
  222.   
  223.     private LinkedList<ItemStatus> GetItemsExtendData() {  
  224.         if (mItemsExtendData == null)  
  225.             mItemsExtendData = new LinkedList<ItemStatus>();  
  226.         return mItemsExtendData;  
  227.     }  
  228.       
  229.     protected ArrayList<Integer> getRemoveCount() {  
  230.         // 获取需要删除的索引数组  
  231.         ArrayList<Integer> needRemoveItemsIndexArray = new ArrayList<Integer>();  
  232.         for (int i = 0; i < GetItemsExtendData().size(); i++) {  
  233.             ItemStatus itemData = GetItemsExtendData().get(i);  
  234.             if (itemData.mIsCheckBoxSelected == true)  
  235.                 needRemoveItemsIndexArray.add(new Integer(i));  
  236.         }  
  237.         return needRemoveItemsIndexArray;  
  238.     }  
  239.   
  240.     @Override  
  241.     public void onClick(View v) {  
  242.         switch (v.getId()) {  
  243.         case R.id.buttonEdit:  
  244.             if (mbStatueShow) {  
  245.                 mbuttonEdit.setText("编辑");  
  246.                 SetShowStatus(false);  
  247.                 findViewById(R.id.layoutBottom).setVisibility(View.GONE);  
  248.                 findViewById(R.id.layoutBottomNew).setVisibility(View.VISIBLE);  
  249.             }else {  
  250.                 SetShowStatus(true);  
  251.                 mbuttonEdit.setText("完成");  
  252.                 findViewById(R.id.layoutBottomNew).setVisibility(View.GONE);  
  253.                 findViewById(R.id.layoutBottom).setVisibility(View.VISIBLE);  
  254.             }  
  255.             break;  
  256.         case R.id.textviewDetele:  
  257.             ArrayList<Integer> needRemoveItemsIndexArray = getRemoveCount();  
  258.   
  259.             // 删除指定项  
  260.             for (int i = needRemoveItemsIndexArray.size() - 1; i >= 0; i--) {  
  261.                 mList.remove(needRemoveItemsIndexArray.get(i).intValue());  
  262.             }  
  263.             InitListViewExtendData();  
  264.             SetShowStatus(true);  
  265.               
  266.             break;  
  267.   
  268.         default:  
  269.             break;  
  270.         }  
  271.     }  
  272.   
  273.     @Override  
  274.     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {  
  275.         switch (buttonView.getId()) {  
  276.         case R.id.checkBox1:  
  277.             if (isChecked) {  
  278.                 for (ItemStatus ItemData : GetItemsExtendData()) {  
  279.                     ItemData.mIsCheckBoxSelected = true;  
  280.                     ItemData.mIsCheckBoxVisible = true;  
  281.                 }         
  282.                 mtextviewShow.setText("已选" +  String.valueOf(mList.size()) +  "项");  
  283.             }else {  
  284.                 for (ItemStatus ItemData : GetItemsExtendData()) {  
  285.                     ItemData.mIsCheckBoxSelected = false;  
  286.                     ItemData.mIsCheckBoxVisible = true;  
  287.                 }         
  288.                 mtextviewShow.setText("已选" +  String.valueOf(0) +  "项");  
  289.             }  
  290.             if (mListAdapt != null) {  
  291.                 ToolUtil.ReCalListViewHeightBasedOnChildren(mListView);  
  292.                 mListAdapt.notifyDataSetChanged();  
  293.             }  
  294.             break;  
  295.   
  296.         default:  
  297.             break;  
  298.         }  
  299.           
  300.     }  
  301. }  


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

[java]  view plain copy
  1. package com.example.listmanage;  
  2.   
  3. import android.view.View;  
  4. import android.view.ViewGroup;  
  5. import android.widget.ListAdapter;  
  6. import android.widget.ListView;  
  7.   
  8. public class ToolUtil {  
  9.   
  10.     public static void ReCalListViewHeightBasedOnChildren(ListView listView) {  
  11.         if (listView == nullreturn;  
  12.         ListAdapter listAdapter = listView.getAdapter();  
  13.         if (listAdapter == nullreturn;  
  14.         int nTotalHeight = 0;  
  15.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  16.             View listItem = listAdapter.getView(i, null, listView);  
  17.             listItem.measure(00);  
  18.             nTotalHeight += listItem.getMeasuredHeight();  
  19.         }  
  20.           
  21.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  22.         params.height = nTotalHeight + (listView.getDividerHeight()*(listAdapter.getCount()-1));  
  23.     }  
  24. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值