Android—滑动ListView保存选中状态
16lz
2021-01-26
通常,我们使用listview,滑动后,view会被销毁,重新滑动,item的checkbox选中状态会回到默认状态,这里我使用一种方法,保存状态,重新显示是,把原来的状态转到view上面。
首先,写一个实体类,保存数据,用于显示
package com.example.info;public class Goods {public int checkimage;public String goodsname;public String text;public boolean ischeck;public boolean isIscheck() {return ischeck;}public void setIscheck(boolean ischeck) {this.ischeck = ischeck;}public int getCheckimage() {return checkimage;}public void setCheckimage(int checkimage) {this.checkimage = checkimage;}public String getGoodsname() {return goodsname;}public void setGoodsname(String goodsname) {this.goodsname = goodsname;}public Goods(int checkimage, String goodsname,boolean ischeck) {super();this.ischeck=ischeck;this.checkimage = checkimage;this.goodsname = goodsname;}public Goods() {super();}@Overridepublic String toString() {return super.toString();}}
再写一个adapter
package com.example.adapter;import java.util.ArrayList;import java.util.HashMap;import com.example.info.Goods;import com.example.listviewselectitem.R;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.ImageView;import android.widget.TextView;public class AppointmentAdapter extends BaseAdapter {// 填充数据的listprivate ArrayList foodlist;// 上下文private Context context;// 用来导入布局private LayoutInflater inflater = null;// 构造器public AppointmentAdapter(ArrayList list, Context context) {this.context = context;this.foodlist = list;inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return foodlist.size();}@Overridepublic Object getItem(int position) {return foodlist.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.item, null);holder.imageView = (ImageView) convertView.findViewById(R.id.food_imager);holder.txt2 = (TextView) convertView.findViewById(R.id.price);holder.cb = (CheckBox) convertView.findViewById(R.id.check_box);// 为view设置标签convertView.setTag(holder);} else {// 取出holderholder = (ViewHolder) convertView.getTag();}// 获取数据Goods goods = foodlist.get(position);// 将数据填充到当前convertView的对应控件中holder.imageView.setImageResource(goods.checkimage);holder.txt2.setText(goods.goodsname);// 设置list中TextView的显示return convertView;}public static class ViewHolder {public TextView txt2;public ImageView imageView;public CheckBox cb;}}
activity文件
package com.example.listviewselectitem;import java.util.ArrayList;import com.example.adapter.AppointmentAdapter;import com.example.adapter.AppointmentAdapter.ViewHolder;import com.example.info.Goods;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.Button;import android.widget.ListView;import android.widget.AdapterView.OnItemClickListener;public class MainActivity extends Activity implements OnClickListener,OnItemClickListener {private ListView listView;private ArrayList goods = new ArrayList();private AppointmentAdapter adapter; private String[] good={"龙井","绿茶","营养快线","怡宝","范姐炒蛋","牛腩粉","广州早擦","柳州螺蛳粉","桂林米粉","过桥米线","康师傅","牛肉面","麻辣烫"};protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();// 初始化控件initData();// 初始化虚拟数据adapter = new AppointmentAdapter(goods, getApplicationContext());listView.setAdapter(adapter);}/** * 初始化控件 * */public void initView() {listView = (ListView) findViewById(R.id.drink_list);// listview列表控件listView.setOnItemClickListener(this);}/** * 初始化数据 * */public void initData() {Class cls = R.drawable.class;try {for(int i=0;i parent, View view, int position,long id) {// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤ViewHolder holder = (ViewHolder) view.getTag();// 改变CheckBox的状态holder.cb.toggle();boolean ischeck=goods.get(position).isIscheck(); String goodsname=goods.get(position).goodsname;Class cls = R.drawable.class;if(ischeck){try {goods.set(position, new Goods(cls.getDeclaredField("circularcheckbox_normal").getInt(null), //如果已经选中,改为未选中状态,保存在//goods里面goodsname,false));} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace(); }}else{try {goods.set(position, new Goods(cls.getDeclaredField("circularcheckbox_press").getInt(null), //如果未选中,改为选中保存goodsname,true));} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace(); }}adapter = new AppointmentAdapter(goods, getApplicationContext()); //再一次刷新adapter和listviewlistView.setAdapter(adapter);}}
工程源码:http://download.csdn.net/detail/weiguishan/8408475
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- 一句话锁定MySQL数据占用元凶
- Android(安卓)ContentProvider详解
- AndroidのContentProvider之数据库更新UI
- SharedPreferences存储数据及文件数据存储
- android:拷贝sqlite数据库到本地sd卡
- 【使用LeanCloud】在Android中添加一行数据
- ListView适配器--ArrayAdapter
- Android(安卓)应用架构组件(Architecture Components)实践