遇到这样的需求是:点击进入一个listview,每个item需要一个checkbox来进行勾选,当退出该activity之后,再次进入该activity之后,需要看到上次退出时候的checkbox的状态,得益于这位前辈的博文已经讲得很好了:listview checkbox 保留状态 可以参考一下,他是默认是不选中,而我的需求第一次进入是全部选中:


主要控制代码如下:SelectInstrumentActivity.java:

package client.verbank.mtp.allone.frame.systemsettings.nextpage;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import jedi.verbank.CSTS3.comm.struct.Instrument;import jedi.verbank.client.station.api.doc.APIDoc;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.preference.PreferenceManager;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import client.verbank.mtp.allone.R;import client.verbank.mtp.allone.frame.systemsettings.nextpage.SelectInstrumentActivityAdapter.ViewHolder;import client.verbank.mtp.allone.util.SharepreferencesUtilSystemSettings;public class SelectInstrumentActivity extends Activity {List<Map<String, Object>> listems;Map<Integer, Boolean> ifchose = new HashMap<Integer, Boolean>();private ListView lv;private SelectInstrumentActivityAdapter mAdapter;private ArrayList<String> list;private Button bt_selectall;private Button bt_cancel;private Button bt_deselectall;private Button newsback;private int checkNum; // 记录选中的条目数量private TextView tv_show;// 用于显示选中的条目数量private Boolean flag = false;private int id;// 消息编号,用来存储故障标号,从上一个界面传来private String defaul = "";// 默认的全部不勾选private String selectall = "";// 全部勾选/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_systemsettings_selectinstrument);// Intent i = getIntent();// Bundle b = i.getBundleExtra("ID");// id = b.getInt("id");/* 实例化各个控件 */lv = (ListView) findViewById(R.id.systeminstrumentlistview);bt_selectall = (Button) findViewById(R.id.bt_selectall);bt_cancel = (Button) findViewById(R.id.bt_cancleselectall);bt_deselectall = (Button) findViewById(R.id.bt_deselectall);tv_show = (TextView) findViewById(R.id.tv);newsback = (Button) findViewById(R.id.newsback);list = new ArrayList<String>();// 为Adapter准备数据initDate();<span style="font-size:18px;color:#ff0000;"><strong>if (!flag) {   //flag标志是为了识别是否为第一次进入全部勾选,当第二次进入默认不勾选,让用户勾选// 初始化勾选框信息,默认都是以未勾选为单位for (int n = 0; n < list.size(); n++) {defaul = defaul + "1";}flag = true;} else {// 初始化勾选框信息,默认都是以未勾选为单位for (int n = 0; n < list.size(); n++) {defaul = defaul + "0";selectall = selectall + "1";}}</strong></span>// 实例化自定义的MyAdaptermAdapter = new SelectInstrumentActivityAdapter(list, this);// 绑定Adapterlv.setAdapter(mAdapter);getCheck();// 获取信息,也可说是初始化信息newsback.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String str = "";// 确定后直接将信息写入preference保存以备下一次读取使用for (int i = 0; i < list.size(); i++) {if (SelectInstrumentActivityAdapter.getIsSelected().get(i)) {str = str + '1';} else {str = str + '0';}}saveCheck(String.valueOf(id), str);// 将数据已字符串形式保存起来,下次读取再用String inarray = SharepreferencesUtilSystemSettings.getValue(getApplicationContext(), "instrument", "AUD/CHF");String[] as = inarray.split(",");StringBuilder str2 = new StringBuilder("");for (int i = 0; i < as.length; i++) {str2.append(as[i]);}finish();}});// 全选按钮的回调接口bt_selectall.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 遍历list的长度,将MyAdapter中的map值全部设为truefor (int i = 0; i < list.size(); i++) {SelectInstrumentActivityAdapter.getIsSelected().put(i, true);}// 数量设为list的长度checkNum = list.size();StringBuilder strall = new StringBuilder("");for (String selstr : list) {strall.append(selstr).append(",");}SharepreferencesUtilSystemSettings.putValue(getApplicationContext(), "instrument",strall.toString());tv_show.setText("已选中" + checkNum + "项");// 刷新listview和TextView的显示dataChanged();}});// 反选按钮的回调接口bt_cancel.setOnClickListener(new OnClickListener() {StringBuilder strfan = new StringBuilder("");@Overridepublic void onClick(View v) {strfan.delete(0, strfan.capacity());// 遍历list的长度,将已选的设为未选,未选的设为已选for (int i = 0; i < list.size(); i++) {if (SelectInstrumentActivityAdapter.getIsSelected().get(i)) {SelectInstrumentActivityAdapter.getIsSelected().put(i,false);checkNum--;} else {SelectInstrumentActivityAdapter.getIsSelected().put(i,true);strfan.append(list.get(i)).append(",");SharepreferencesUtilSystemSettings.putValue(getApplicationContext(), "instrument",strfan.toString());checkNum++;}}// 刷新listview和TextView的显示dataChanged();}});// 取消按钮的回调接口bt_deselectall.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 遍历list的长度,将已选的按钮设为未选for (int i = 0; i < list.size(); i++) {if (SelectInstrumentActivityAdapter.getIsSelected().get(i)) {SelectInstrumentActivityAdapter.getIsSelected().put(i,false);checkNum--;// 数量减1}}SharepreferencesUtilSystemSettings.putValue(getApplicationContext(), "instrument", "");// 刷新listview和TextView的显示dataChanged();}});final StringBuilder str = new StringBuilder("");// 绑定listView的监听器lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤ViewHolder holder = (ViewHolder) arg1.getTag();// 改变CheckBox的状态holder.cb.toggle();// 将CheckBox的选中状况记录下来SelectInstrumentActivityAdapter.getIsSelected().put(arg2,holder.cb.isChecked());// 调整选定条目if (holder.cb.isChecked() == true) {str.delete(0, str.capacity());checkNum++;} else {str.delete(0, str.capacity());checkNum--;}for (int i = 0; i < list.size(); i++) {if (SelectInstrumentActivityAdapter.getIsSelected().get(i)) {str.append(list.get(i)).append(",");}}SharepreferencesUtilSystemSettings.putValue(getApplicationContext(), "instrument", str.toString());tv_show.setText("已选中" + checkNum + "项");}});}// 初始化数据private void initDate() {// 去掉相同的商品List<Instrument> instList = APIDoc.getSystemDocCaptain().getInstrumentList();for (Instrument instrument : instList) {list.add(instrument.getInstrument());}}
<span style="font-size:18px;color:#ff0000;"><strong>// 得到保存在这个activity中的数据public void getCheck() {SharedPreferences mPerferences = PreferenceManager.getDefaultSharedPreferences(this);// 获取默认的preference// 获取activity私有的preferenceSharedPreferences m_private = this.getPreferences(MODE_PRIVATE);String counter = mPerferences.getString(String.valueOf(id), defaul);// 如果没有获取到的话默认是0for (int i = 0; i < list.size(); i++) {if (counter.charAt(i) == '1') {SelectInstrumentActivityAdapter.getIsSelected().put(i, true);}}}// 保存需要保存的数据public void saveCheck(String ID, String data) {// 保存shujuSharedPreferences mPerferences = PreferenceManager.getDefaultSharedPreferences(this);SharedPreferences m_private = this.getPreferences(MODE_PRIVATE);SharedPreferences.Editor mEditor = mPerferences.edit();mEditor.putString(ID, data);mEditor.commit();}</strong></span>// 刷新listview和TextView的显示private void dataChanged() {// 通知listView刷新mAdapter.notifyDataSetChanged();// TextView显示最新的选中数目tv_show.setText("已选中" + checkNum + "项");};}


适配器类:SelectInstrumentActivityAdapter.java

package client.verbank.mtp.allone.frame.systemsettings.nextpage;import java.util.ArrayList;import java.util.HashMap;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.TextView;import client.verbank.mtp.allone.R;public class SelectInstrumentActivityAdapter extends BaseAdapter {// 填充数据的listprivate ArrayList<String> list;// 用来控制CheckBox的选中状况private static HashMap<Integer, Boolean> isSelected;// 上下文private Context context;// 用来导入布局private LayoutInflater inflater = null;// 构造器public SelectInstrumentActivityAdapter(ArrayList<String> list,Context context) {this.context = context;this.list = list;inflater = LayoutInflater.from(context);isSelected = new HashMap<Integer, Boolean>();// 初始化数据initDate();}// 初始化isSelected的数据private void initDate() {for (int i = 0; i < list.size(); i++) {getIsSelected().put(i, false);}}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {// 获得ViewHolder对象holder = new ViewHolder();// 导入布局并赋值给convertviewconvertView = inflater.inflate(R.layout.activity_systeminstrument_item, null);holder.tv = (TextView) convertView.findViewById(R.id.item_tv);holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);// 为view设置标签convertView.setTag(holder);} else {// 取出holderholder = (ViewHolder) convertView.getTag();}// 设置list中TextView的显示holder.tv.setText(list.get(position));// 根据isSelected来设置checkbox的选中状况holder.cb.setChecked(getIsSelected().get(position));return convertView;}public static HashMap<Integer, Boolean> getIsSelected() {return isSelected;}public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {SelectInstrumentActivityAdapter.isSelected = isSelected;}public static class ViewHolder {TextView tv;CheckBox cb;}}

主要要实现保存checkbox的状态的方式使用sharepreferences来保存状态,当选中的时候为1,不选中的时候为0,当再次进入该activity时,使用charat方式来取出每个listview item的状态是为1还是0,接着使用:
SelectInstrumentActivityAdapter.getIsSelected().put(i, true);

来设置状态。

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. android Intent常用介绍
  5. 【Android】Fragment懒加载和ViewPager的坑
  6. Android(安卓)native进程间通信实例-binder结合共享内存
  7. Android成长历程第一步
  8. Android开发之内容提供者
  9. 【项目】Android(安卓)预置第三方应用可卸载功能的实现

随机推荐

  1. 使用javascript进行内容占位符问题的第二
  2. 围绕一个带有jQuery旋钮的输入元素。
  3. 如何在java脚本中获取节点内部文本?
  4. jQuery实现checkbox的全选和反选
  5. jquery 循环添加事件
  6. 将ajax GET请求发送到ASP .NET Web API
  7. 如何在流体宽度旋转木马中的页面之间创建
  8. 5秒后删除新的div
  9. jQuery中的ajax服务端返回方式
  10. 使用ajax请求上传文件[副本]