如何在列表视图中加载和保存复选框值

时间:2014-04-14 14:02:52

标签: android listview checkbox sharedpreferences

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

任何人都知道如何做到这一点???

P.S。我已经阅读了一些内容,我找到了自定义adapters,但我不太了解它们。如果有人能解释我的话,也会受到赞赏。

2 个答案:

答案 0 :(得分:2)

在扩展自定义Adapter时,您正在精确实现您所描述的内容。在你的情况下,似乎ArrayAdapter足以实现它。

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

CheckBox cb = convertView.findViewById(R.id.myCheckbox);

并使用适当的值设置调用cb.isChecked(...),以显示该复选框的当前行值。

一些有用的链接:

答案 1 :(得分:0)

我不熟悉带有复选框的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);
    }

}

RowWrapper类:

package com.example.stackover;

import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

public class RowWrapper {
    View        base;
    TextView    description = null;
    CheckBox    cb    = null;

    public RowWrapper(View base) {
        this.base=base;
    }

    public TextView getDescription() {
        if (description==null) {
            description=(TextView)base.findViewById(R.id.description);
        }
        return(description);
    }
    public TextView getCb() {
        if (cb==null) {
            cb=(CheckBox)base.findViewById(R.id.cb);
        }
        return(cb);
    }

    public View getBase(){
        return this.base;
    }
}

你的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,并使用构建函数设置适配器,以获取您的活动和共享首选项中的复选框列表。如果要更改描述textview,可以使用另一个保存文本的数组,并根据您的位置在getView()中设置它们。