AdapterView中的Android访问复选框

AdapterView中的Android访问复选框,android,layout,checkbox,adapter,Android,Layout,Checkbox,Adapter,我有第二个右对齐的导航抽屉,里面有一个带有复选框的适配器。 当我更改这些复选框时,CB的名称将存储(或删除)在StringSet中,并提交给我的应用程序sharedPrefs。-这是有效的 现在,我想在应用程序启动时检索这些字符串并自动选中这些框,这样用户就不必这样做了 但我完全不知道如何访问复选框 目前为止,这是我的适配器: package de.timhartmann.ledcontroller; import android.content.Context; import androi

我有第二个右对齐的导航抽屉,里面有一个带有复选框的适配器。 当我更改这些复选框时,CB的名称将存储(或删除)在StringSet中,并提交给我的应用程序sharedPrefs。-这是有效的

现在,我想在应用程序启动时检索这些字符串并自动选中这些框,这样用户就不必这样做了

但我完全不知道如何访问复选框

目前为止,这是我的适配器:

package de.timhartmann.ledcontroller;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * Created by Tim on 02.03.2015.
 */
public class NavDrawerZonesAdapter extends BaseAdapter {
    private final ArrayList mData;
    public Set<String> selectedStrings = new HashSet<String>();

    public NavDrawerZonesAdapter(Map<String, String> map) {
        mData = new ArrayList();
        mData.addAll(map.entrySet());
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Map.Entry<String, String> getItem(int position) {
        return (Map.Entry) mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO implement you own logic with ID
        return 0;
    }

    public void refreshList(Map<String, String> map){

        mData.clear();
        mData.addAll(map.entrySet());
        notifyDataSetChanged();

    }

    private class ViewHolder {
        TextView zone;
        TextView IP;
        CheckBox ZoneCheckBox;
    }

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

        final Context context = parent.getContext();

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        final SharedPreferences.Editor editor = prefs.edit();

        ViewHolder viewHolder = null;

        if (convertView == null){

            LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.nav_drawer_zones_adapter, null);

            viewHolder = new ViewHolder();
            convertView.setTag(viewHolder);

           viewHolder.ZoneCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

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

                   if (isChecked) {
                       selectedStrings.add(buttonView.getText().toString());
                       editor.putStringSet("zones", selectedStrings).commit();
                       Toast.makeText(context, "Checkbox: " + buttonView.getText().toString(), Toast.LENGTH_LONG).show();
                   }else{
                       selectedStrings.remove(buttonView.getText().toString());
                       editor.putStringSet("zones", selectedStrings).commit();
                   }

               }

           });

        }

        else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

        Map.Entry zones = (Map.Entry) mData.get(position);
        viewHolder.ZoneCheckBox.setText((CharSequence) zones.getKey());

        return convertView;
    }

}
package de.timhartmann.ledcontroller;
导入android.content.Context;
导入android.content.SharedReferences;
导入android.preference.PreferenceManager;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.CompoundButton;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.util.ArrayList;
导入java.util.HashSet;
导入java.util.Map;
导入java.util.Set;
/**
*由Tim于2015年3月2日创建。
*/
公共类NavDroperZoneAdapter扩展了BaseAdapter{
私有最终ArrayList mData;
public Set selectedStrings=new HashSet();
公共导航区适配器(地图){
mData=newarraylist();
mData.addAll(map.entrySet());
}
@凌驾
public int getCount(){
返回mData.size();
}
@凌驾
公共映射。条目getItem(int位置){
返回(Map.Entry)mData.get(position);
}
@凌驾
公共长getItemId(int位置){
//TODO使用ID实现您自己的逻辑
返回0;
}
公共无效刷新列表(地图){
mData.clear();
mData.addAll(map.entrySet());
notifyDataSetChanged();
}
私有类视窗持有者{
文本视图区;
文本视图IP;
复选框ZoneCheckBox;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
final Context=parent.getContext();
SharedReferences prefs=PreferenceManager.GetDefaultSharedReferences(上下文);
final SharedPreferences.Editor=prefs.edit();
ViewHolder ViewHolder=null;
if(convertView==null){
LayoutInflater LayoutInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
convertView=LayoutFlater.充气(R.layout.nav\u抽屉\u区域\u适配器,空);
viewHolder=新的viewHolder();
convertView.setTag(viewHolder);
viewHolder.ZoneCheckBox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
添加(buttonView.getText().toString());
putStringSet(“zones”,selectedStrings).commit();
Toast.makeText(上下文,“复选框:“+buttonView.getText().toString(),Toast.LENGTH_LONG.show()”;
}否则{
selectedStrings.remove(buttonView.getText().toString());
putStringSet(“zones”,selectedStrings).commit();
}
}
});
}
否则{
viewHolder=(viewHolder)convertView.getTag();
}
Map.Entry zones=(Map.Entry)mData.get(position);
viewHolder.ZoneCheckBox.setText((CharSequence)zones.getKey());
返回视图;
}
}
以及适配器布局:

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

    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:focusable="false"
        android:textSize="20dp"
        android:layout_marginTop="5dp"
        android:focusableInTouchMode="false" />

</RelativeLayout>

当应用程序启动时,在完成视图绘制后,首先检查

checkBox.isChecked()
如果为真,则进行搜索,否则不进行搜索

目前,您只在上执行此操作

viewHolder.ZoneCheckBox.setOnCheckedChangeListener
因此,无论何时复选框状态发生变化,都会发生相反的情况

已编辑

正如你的评论,我有了新的逻辑

当您将文本存储在共享优先级中时,您也可以存储该复选框/视图的位置

//在适配器类中 现在开始检查SharedPreference是否包含此位置键,并从shared Preference获取该位置,然后将该位置与适配器位置进行比较,并在该位置设置复选框true

 if(sharedprefrence.contains("positionkey") && sharedprefrence.get("positionkey","").equals(String.valueOf(position))){

    //setcheckbox true at this poition 
    }

是的,但是我怎样才能进入这个盒子呢?如果我试图访问cb来检查它的命名是否像我的StringSet中的一个字符串,比如
if(selectedStrings.contains(viewHolder.ZoneCheckBox.getText().toString()){viewHolder.ZoneCheckBox.setChecked(true);}
它不起作用