Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在列表视图中保存复选框的状态_Java_Android_Android Recyclerview - Fatal编程技术网

Java 在列表视图中保存复选框的状态

Java 在列表视图中保存复选框的状态,java,android,android-recyclerview,Java,Android,Android Recyclerview,我对安卓开发还比较陌生,需要一些帮助 我想做的是在我的listview中的项目旁边放置一些复选框,并在我关闭并重新启动应用程序时保存这些选择,我尝试过,但被共享引用和recycler view部件弄糊涂了,希望有人能帮我解决这个问题,下面是我正在使用的代码: 主要活动: public class MainActivity extends AppCompatActivity { Toolbar mToolbar; ListView mListView; TextView mTextView;

我对安卓开发还比较陌生,需要一些帮助

我想做的是在我的listview中的项目旁边放置一些
复选框
,并在我关闭并重新启动应用程序时保存这些选择,我尝试过,但被
共享引用
和recycler view部件弄糊涂了,希望有人能帮我解决这个问题,下面是我正在使用的代码:

主要活动:

public class MainActivity extends AppCompatActivity {

Toolbar mToolbar;
ListView mListView;
TextView mTextView;

String[] countryNames = {"Canberra, Australia", "Sydney, Australia" 
,"Brazil", "China", "France", "Germany", "India", "Italy"
            , "Mexico", "Russia", "Spain", "US"};

    int[] countryFlags = {R.drawable.flag_australia,
            R.drawable.flag_australia,
            R.drawable.flag_brazil,
            R.drawable.flag_china,
            R.drawable.flag_france,
            R.drawable.flag_germany,
            R.drawable.flag_india,
            R.drawable.flag_italy,
            R.drawable.flag_mexico,
            R.drawable.flag_russia,
            R.drawable.flag_spain,
            R.drawable.flag_us};

    String [] countryDetails = {// Canberra, Australia

"Capital of Australia" + System.lineSeparator()+"Population - 
356,585" + " " + System.lineSeparator() +"Nearest Airport : Canberra 
Airport"+ System.lineSeparator(),

//Sydney Australia
"Major City in Australia" + 
System.lineSeparator()+"Population: 4.02 Million" + System.lineSeparator() 
+" Nearest Airport: Western Sydney Airport",
            "Brazil Here",
            "Chine Here",
            "France Here",
            "Germany Here",
            "India Here",
            "Italy Here",
            "Mexico",
            "Russia",
            "Spain",
            "US" };

    @Override
protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            mToolbar = (Toolbar) findViewById(R.id.toolbar);
            mToolbar.setTitle(getResources().getString(R.string.app_name));

            mListView = (ListView) findViewById(R.id.listview);
            mTextView = (TextView) findViewById(R.id.textView);

            MyAdapter myAdapter = new MyAdapter(MainActivity.this, 
            countryNames, countryFlags, countryDetails);

            mListView.setAdapter(myAdapter);
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Intent mIntent = new Intent(MainActivity.this, DetailActivity.class);
                    mIntent.putExtra("countryName", countryNames[i]);
                    mIntent.putExtra("countryFlag", countryFlags[i]);
                    mIntent.putExtra("countryDetails", countryDetails[i]);
                    startActivity(mIntent);
                }
            });
        }
    }

但是现在我遇到了一个问题,当我滚动或更改活动时,我无法保存复选框状态,不确定现在如何在if(isChecked)部分中执行该部分创建自定义模型并保存每个元素的选中/未选中值。并根据它们在getView()方法中显示可能重复的不确定如何准确地进行编辑以添加新信息使用this.context=applicationContext;而不是this.context=context;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:descendantFocusability="blocksDescendants">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Title"
       />

    <CheckBox
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:focusable="false"
        android:text="Favorite" />

</LinearLayout>             
  public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder mViewHolder = new ViewHolder();

        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) mContext.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.listview_item, 
parent, false);
            mViewHolder.mFlag = (ImageView) 
convertView.findViewById(R.id.imageView);
            mViewHolder.mName = (TextView) 
convertView.findViewById(R.id.textView);
            mViewHolder.mCheckBox = 
convertView.findViewById(R.id.check_Box);

        } else {
            mViewHolder = (ViewHolder) convertView.getTag();
        }
        mContext.getSharedPreferences("FreshStart",0);
        mViewHolder.mFlag.setImageResource(flags[position]);
        mViewHolder.mName.setText(names[position]);

        SharedPreferences sp = mContext.getSharedPreferences("FreshStart", 0);
        boolean shouldBeChecked = sp.getBoolean(names[position], false);
        mViewHolder.mCheckBox.setTag(names[position]);
        convertView.setTag(R.layout.listview_item);
        mViewHolder.mCheckBox.setChecked(shouldBeChecked);


        mViewHolder.mCheckBox.setOnCheckedChangeListener(new 
        CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {
                    buttonView.setChecked(true);
                    Toast.makeText(mContext, "Saved as Favorite", Toast.LENGTH_SHORT).show();
                }
                else{
                    Toast.makeText(mContext, "No Longer set as Favorite", Toast.LENGTH_SHORT).show();
                }

            }
        });

        return convertView;
    }
static class ViewHolder {
    ImageView mFlag;
    TextView mName;
    CheckBox mCheckBox;
}