Android 如何在listview中加载和保存复选框值

Android 如何在listview中加载和保存复选框值,android,listview,checkbox,sharedpreferences,Android,Listview,Checkbox,Sharedpreferences,我有一个充满文本的列表视图,但每行也有一个复选框。调用onCreate()时,我希望它从SharedReferences加载复选框值,并将其应用于复选框。另外,当调用onPaused()时,我希望它保存复选框值 有人知道怎么做吗 另外,我读了一些东西,找到了定制的适配器,但我不太明白它们的意思。如果有人能向我解释这一点,我将不胜感激。在扩展自定义适配器时,您正是在实现您描述的东西。在您的情况下,ArrayAdapter似乎足以实现它 该适配器有一个getView()方法,将为您的每一行调用该方法

我有一个充满文本的列表视图,但每行也有一个复选框。调用
onCreate()
时,我希望它从
SharedReferences
加载复选框值,并将其应用于复选框。另外,当调用
onPaused()
时,我希望它保存复选框值

有人知道怎么做吗


另外,我读了一些东西,找到了定制的
适配器
,但我不太明白它们的意思。如果有人能向我解释这一点,我将不胜感激。

在扩展自定义
适配器时,您正是在实现您描述的东西。在您的情况下,
ArrayAdapter
似乎足以实现它

该适配器有一个
getView()
方法,将为您的每一行调用该方法,该方法基本上处理这些行,并实现它们的显示方式。此方法有3个参数,第一个参数是正在渲染的行的
位置。第二个是
视图
,模糊地说,它代表了整行的布局。第三个表示
视图的父视图。这样,假设第二个参数名为
convertView
,则可以执行以下操作:

CheckBox cb = convertView.findViewById(R.id.myCheckbox);
并使用适当的值设置call
cb.isChecked(…)
,以显示该复选框的当前行值

一些有用的链接:


我不熟悉带有复选框的android预实现列表视图。如果有,那么应该有一种方法根据位置检查它们。但我建议您使用自定义的ArrayAdapter并定义您的复选框。在getView()中,您只需检查位置,并根据位置设置复选框

编辑:事实上,这里有一个编辑,是整个过程的一个例子

MyAdapter类:

package com.example.stackover;

import java.util.ArrayList;

import android.app.ListActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class MyAdapter extends BaseAdapter {

    ArrayList<Integer> checkBoxList;
    ListActivity mListActivity;

    public MyAdapter(ListActivity mListActivity, ArrayList<Integer> checkBoxList) {
        this.mListActivity = mListActivity;
        this.checkBoxList = checkBoxList;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return checkBoxList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return checkBoxList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row=convertView;
        RowWrapper wrapper = null;
        if (row==null) {
            LayoutInflater inflater = mListActivity.getLayoutInflater();
            row=inflater.inflate(R.layout.listrow, parent, false);
            wrapper=new RowWrapper(row);
            row.setTag(wrapper);
        }
        if(checkBoxList.contains(position)) {
            wrapper.getCb().setSelected(true);
        }
        return(row);
    }

}
以及您的listrow.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView 
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <CheckBox 
        android:id="@+id/cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


</LinearLayout>


在ListActivity或ListFragment中,创建MyAdapter,并使用构造函数从共享pref中获取活动和复选框列表来设置适配器。如果要更改描述textview,请使用另一个保存文本并在getView()中设置它们的数组,以同样的方式进行更改根据您的位置。

好的,这是关于保存,但是加载呢?哦,顺便问一下,什么时候调用getView()方法?不,这是关于加载的。每次渲染一行时,都会调用此方法,以便从
SharedReferences
中获取值并进行相应设置。保存它的方式取决于您的实现,但是如果您将它保存在
SharedReference
s中,则很容易加载/存储。如果要将值保存在数据库中,这会有点复杂,但也完全可行。甚至从远程Web服务获取它们。这在很大程度上取决于您的实现。它在加载
列表视图时自动调用。这意味着当显示
ListView
时,它将显示X行(取决于布局的实现),
getView()
因此将为这些行中的每一行调用,修改我上面描述的相应三个参数以适合每一行。好的。最后一个问题(可能是)。在哪里添加我的实现?我应该将arrayadapter子类化吗?你尝试过onscrolllistener吗?没有,但听起来好像是这样的,这不是我要找的东西…再想想,让你的数组对象成为布尔型。我不知道为什么我认为你需要一个整数类型。最后,数组应仅指示是否选中行:)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView 
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <CheckBox 
        android:id="@+id/cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


</LinearLayout>