简体   繁体   English

如何使用BaseAdapter在ListView中保存我的CheckBox项的状态

[英]how to save the state of my CheckBox items in ListView with BaseAdapter

My CourseFragmentActivity class extends FragmentActivity that uses a ViewPager with 5 tabs. 我的CourseFragmentActivity类扩展了FragmentActivity,它使用具有5个选项卡的ViewPager。 I have a ListView in each tab that displays an ArrayList of CheckBox items. 我在每个选项卡中都有一个ListView,用于显示CheckBox项的ArrayList。 On the 5th tab of my ViewPager, I have a single button to navigate to another FragmentActivity class. 在ViewPager的第5个选项卡上,我有一个按钮可以导航到另一个FragmentActivity类。 The problem is when I select a CheckBox item in one of my ListView in CourseFragmentActivity class, then I click on the button to navigate to another FragmentActivity class, I lose the state of the CheckBox item when I navigate back to my CourseFragmentActivity class from the other FragmentActivity class. 问题是当我在CourseFragmentActivity类的一个ListView中选择一个CheckBox项时,然后单击按钮导航到另一个FragmentActivity类,当我从另一个导航回我的CourseFragmentActivity类时,我失去了CheckBox项的状态FragmentActivity类。 How do I save the state of my CheckBox items in ListView when switching between 2 FragmentActivity through my BaseAdapter? 通过BaseAdapter在2 FragmentActivity之间切换时,如何在ListView中保存CheckBox项的状态?

Below is my BaseAdapter for setting the CheckBox items of my ListView: 下面是我的BaseAdapter,用于设置ListView的CheckBox项:

package com.usjr.sss.adapter;

import java.util.ArrayList;
import com.usjr.sss.MyConstants;
import com.usjr.sss.R;
import com.usjr.sss.activity.CourseFragmentActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class InfoTechAdapter extends BaseAdapter {

private ArrayList<String> subjectArrayList;
private CourseFragmentActivity activity;
private String subject;

public InfoTechAdapter(CourseFragmentActivity activity,
        ArrayList<String> subjectArrayList) {
    this.activity = activity;
    this.subjectArrayList = subjectArrayList;
}

@Override
public int getCount() {
    if (subjectArrayList != null) {
        return subjectArrayList.size();
    } else {
        return 0;
    }
}

@Override
public String getItem(int position) {
    if (subjectArrayList != null) {
        return subjectArrayList.get(position);
    } else {
        return null;
    }
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) this.activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.subject_row, null);
        viewHolder = new ViewHolder();
        viewHolder.checkBoxToSend = (CheckBox) convertView
                .findViewById(R.id.subject);
        viewHolder.checkBoxToSend.setText(getItem(position));
        subject = viewHolder.checkBoxToSend.getText().toString();
        /**
         * Missing set checked state of CheckBox item
         */

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }// end if-else (convertView == null)

    viewHolder.ref = position;
    viewHolder.checkBoxToSend.setClickable(true);

    viewHolder.checkBoxToSend.setOnClickListener(new MyClickListener(
            viewHolder));
    viewHolder.checkBoxToSend
            .setOnCheckedChangeListener(new MyCheckChangeListener(
                    viewHolder));

    return convertView;
}// end getView

class ViewHolder {
    private CheckBox checkBoxToSend;
    int ref;
}// end ViewHolder

/**
 * Handle onClick
 */
class MyClickListener implements OnClickListener {

    ViewHolder viewHolder = null;

    public MyClickListener(ViewHolder viHolder) {
        viewHolder = viHolder;
    }

    @Override
    public void onClick(View v) {
        ArrayList<String> arrayListSelectedSubject = MyConstants.ARRAYLIST_SELECTED_SUBJECT;
        String stringNull = String.valueOf(arrayListSelectedSubject);
        String subject = ((CheckBox) v).getText().toString();

        if (((CheckBox) v).isChecked()) {
            /**
             * Check if ARRAYLIST_SELECTED_SUBJECT is null
             */
            if (!stringNull.equals("null")) {
                /**
                 * if ARRAYLIST_SELECTED_SUBJECT is not null, check if
                 * ArrayList does not contain duplicate subject
                 */
                if (!arrayListSelectedSubject.contains(subject)) {
                    arrayListSelectedSubject.add(subject);
                }// end if
                    // (!arrayListSelectedSubject.contains(subject))
            } else {
                /**
                 * if ARRAYLIST_SELECTED_SUBJECT is null, automatically add
                 * subject to ArrayList
                 */
                arrayListSelectedSubject = new ArrayList<String>();
                arrayListSelectedSubject.add(subject);
            }// end if-else (!stringNull.equals("null"))
        }// end if (((CheckBox) v).isChecked())

        if (!((CheckBox) v).isChecked()) {
            arrayListSelectedSubject.remove(arrayListSelectedSubject
                    .indexOf(subject));
        }// end if (!((CheckBox) v).isChecked())

        MyConstants.ARRAYLIST_SELECTED_SUBJECT = arrayListSelectedSubject;
        Log.i("ARRAYLIST_SELECTED_SUBJECT",
                String.valueOf(MyConstants.ARRAYLIST_SELECTED_SUBJECT));

    }// end onClick
}// end MyClickListener

/**
 * Handle CheckBox state
 */
class MyCheckChangeListener implements OnCheckedChangeListener {

    ViewHolder viewHolder = null;

    public MyCheckChangeListener(ViewHolder viHolder) {
        viewHolder = viHolder;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {

        if (viewHolder.checkBoxToSend.equals(buttonView)) {
            if (!isChecked) {
                /**
                 * Missing syntax for saving false state of CheckBox
                 */
                Log.i("onCheckedChanged", "false");
            } else {
                /**
                 * Missing syntax for saving true state of CheckBox
                 */
                Log.i("onCheckedChanged", "true");
            }// end if-else (!isChecked)

        }// end if (viewHolder.checkBoxToSend.equals(buttonView))

    }// end onCheckedChanged
}// end OncheckchangeListner
}

I got it working with SharedPreferences. 我与SharedPreferences一起使用。

Below is my updated code on handling CheckBox state changed 下面是我处理CheckBox状态更改后的更新代码

class MyCheckChangeListener implements OnCheckedChangeListener {

    ViewHolder viewHolder = null;

    public MyCheckChangeListener(ViewHolder viHolder) {
        viewHolder = viHolder;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {

        String subject = buttonView.getText().toString();

        if (viewHolder.checkBoxToSend.equals(buttonView)) {
            if (!isChecked) {
                /**
                 * Missing syntax for saving false state of CheckBox
                 */
                editor.putBoolean(subject, false);
                editor.commit();
            } else {
                /**
                 * Missing syntax for saving true state of CheckBox
                 */
                editor.putBoolean(subject, true);
                editor.commit();
            }// end if-else (!isChecked)
        }// end if (viewHolder.checkBoxToSend.equals(buttonView))
    }// end onCheckedChanged
}// end OncheckchangeListner

Then I set the state of my CheckBox item from the getView() method of my BaseAdapter 然后我从BaseAdapter的getView()方法设置CheckBox项的状态

String subject = viewHolder.checkBoxToSend.getText().toString();
viewHolder.checkBoxToSend.setChecked(sharedPreferences.getBoolean(
                subject, false));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM