Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.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
Android 应用程序关闭时共享首选项列表视图不工作_Android_Listview_Sharedpreferences_Baseadapter - Fatal编程技术网

Android 应用程序关闭时共享首选项列表视图不工作

Android 应用程序关闭时共享首选项列表视图不工作,android,listview,sharedpreferences,baseadapter,Android,Listview,Sharedpreferences,Baseadapter,我正在尝试学习如何为我创建的应用程序使用listview,我已经让应用程序显示带有项目、图像和复选框的listview 我试图实现的是:当他们单击复选框时,该状态将保存,以备下次打开应用程序时使用。我认为我的代码是正确的,但不确定我做错了什么,因为当我重新打开应用程序时,所有复选框都被勾选回false 如有任何帮助,将不胜感激: 我的代码:适配器: public class ListAdapter extends BaseAdapter { Context ctx; LayoutInflater

我正在尝试学习如何为我创建的应用程序使用listview,我已经让应用程序显示带有项目、图像和复选框的listview

我试图实现的是:当他们单击复选框时,该状态将保存,以备下次打开应用程序时使用。我认为我的代码是正确的,但不确定我做错了什么,因为当我重新打开应用程序时,所有复选框都被勾选回false

如有任何帮助,将不胜感激:

我的代码:适配器:

public class ListAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<Product> objects;


ListAdapter(Context context, ArrayList<Product> products) {
    ctx = context;
    objects = products;
    lInflater = (LayoutInflater) ctx
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

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

@Override
public Object getItem(int position) {
    return objects.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        view = lInflater.inflate(R.layout.item, parent, false);
    }

   final Product p = getProduct(position);

    ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
    ((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
    ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);

    final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
    SharedPreferences settings  = ctx.getSharedPreferences("data",ctx.MODE_PRIVATE);
    boolean Checked = settings.getBoolean(p.name, false);
    cbBuy.setChecked(Checked);



    cbBuy.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if(cbBuy.isChecked()==true){
                SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
                settings.edit().putBoolean(p.name, true).commit();
                Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();


            }else{
                SharedPreferences settings = ctx.getSharedPreferences("data", Context.MODE_PRIVATE);
                settings.edit().putBoolean(p.name, false).commit();
                Toast.makeText(ctx, "You Deselected" +p.name, Toast.LENGTH_SHORT).show();

            }
        }
    });{

        return view;

    }

}

Product getProduct(int position) {
    return ((Product) getItem(position));
}

ArrayList<Product> getBox() {
    ArrayList<Product> box = new ArrayList<Product>();
    for (Product p : objects) {
        if (p.box)
            box.add(p);
    }
    return box;
}

OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView,
                                 boolean isChecked) {

        getProduct((Integer) buttonView.getTag()).box = isChecked;

    }


};
}
主要活动

public class MainActivity extends AppCompatActivity {

ArrayList<Product> products = new ArrayList<Product>();
ListAdapter boxAdapter;
private SharedPreferences mPrefs;
private String mData;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    fillData();
    boxAdapter = new ListAdapter(this, products);

    ListView lvMain = (ListView) findViewById(R.id.lvMain);
    lvMain.setAdapter(boxAdapter);

}

void fillData() {
    products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alf", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfa", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfae", "5120%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfsdfsdfakher", "50435%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfasdfsdfkher", "5123120%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfasdfsdfkher", "501231%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfaksdfsdfher", "11250%", R.drawable.ic_launcher, false));
    /*for (int i = 1; i <= 20; i++) {
        products.add(new Product("Product " + i, i * 100,
                R.drawable.ic_launcher, false));
    }*/
}

/*public void showResult(View v) {
    String result = "Selected Product are :";
    int totalAmount=0;
    for (Product p : boxAdapter.getBox()) {
        if (p.box){
            result += "\n" + p.name;
            totalAmount+=p.price;
        }
    }
    Toast.makeText(this, result+"\n"+"Total Amount:="+totalAmount, Toast.LENGTH_LONG).show();
}*/
}

如果你想用SharedReference管理你的产品,你可以这样做

MainActivity.java

public class MainActivity extends AppCompatActivity {

ArrayList<Product> products = new ArrayList<Product>();
ListAdapter boxAdapter;
private SharedPreferences mPrefs;
private String mData;
public static final String PREFS_NAME = "Product_Prefrence";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    products=getProductArray(this,"Products");
    if(products==null)
    { 
        fillData();
    }
    boxAdapter = new ListAdapter(this, products);

    ListView lvMain = (ListView) findViewById(R.id.lvMain);
    lvMain.setAdapter(boxAdapter);

}

void fillData() {
    products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alf", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfa", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfae", "5120%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfsdfsdfakher", "50435%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfasdfsdfkher", "5123120%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfasdfsdfkher", "501231%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfaksdfsdfher", "11250%", R.drawable.ic_launcher, false));

}

  @Override
    public void onBackPressed() {
        saveProductArray(MainActivity.this,products,"Products");
        finish();
    }

    public void saveProductArray(Context c, List<Product> arrayList, String key) {

        SharedPreferences settings = c.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        Gson gson = new Gson();
        String json = gson.toJson(arrayList);
        editor.putString(key, json).apply();

    }

    @NonNull
    public ArrayList<Product> getProductArray(Context c, String key) {

        Gson gson = new Gson();
        SharedPreferences settings = c.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        String json = settings.getString(key, "");
        Type type = new TypeToken<ArrayList<Product>>() {
        }.getType();
        ArrayList<Product> arrayList = gson.fromJson(json, type);

        return arrayList;
    }


}
无需维护单一产品价值的sharepreference


希望这会对你有所帮助。如果你仍然面临问题,我们会找到其他方法

尝试调试代码?是的,但没有结果。我想你的产品有相同的名称added@Sheychan即使我只有一种产品,它的功能也完全相同thing@KoVartthan嗯,我在listview使用其他方法之前已经让它工作过了,但是如果我不能我一定会查出来的,谢谢:因为Gson你可以使用这个依赖编译'com.google.code.Gson:Gson:2.6.2',这也很有效,我找到了另一种解决方法。只需在onClicked中添加ifobject.getposition.isselected,并设置共享首选项即可。很好,您已经解决了这个问题…很高兴帮助您…再次感谢,我将使用您为另一个活动提供的代码,因为它更适合于此:
public class MainActivity extends AppCompatActivity {

ArrayList<Product> products = new ArrayList<Product>();
ListAdapter boxAdapter;
private SharedPreferences mPrefs;
private String mData;
public static final String PREFS_NAME = "Product_Prefrence";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    products=getProductArray(this,"Products");
    if(products==null)
    { 
        fillData();
    }
    boxAdapter = new ListAdapter(this, products);

    ListView lvMain = (ListView) findViewById(R.id.lvMain);
    lvMain.setAdapter(boxAdapter);

}

void fillData() {
    products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alf", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfa", "5230%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfae", "5120%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfsdfsdfakher", "50435%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfasdfsdfkher", "5123120%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfasdfsdfkher", "501231%", R.drawable.ic_launcher, false));
    products.add(new Product("Alfaksdfsdfher", "11250%", R.drawable.ic_launcher, false));

}

  @Override
    public void onBackPressed() {
        saveProductArray(MainActivity.this,products,"Products");
        finish();
    }

    public void saveProductArray(Context c, List<Product> arrayList, String key) {

        SharedPreferences settings = c.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        Gson gson = new Gson();
        String json = gson.toJson(arrayList);
        editor.putString(key, json).apply();

    }

    @NonNull
    public ArrayList<Product> getProductArray(Context c, String key) {

        Gson gson = new Gson();
        SharedPreferences settings = c.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        String json = settings.getString(key, "");
        Type type = new TypeToken<ArrayList<Product>>() {
        }.getType();
        ArrayList<Product> arrayList = gson.fromJson(json, type);

        return arrayList;
    }


}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        view = lInflater.inflate(R.layout.item, parent, false);
    }

   final Product p = getProduct(position);

    ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
    ((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
    ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);

    final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);

//use click listener instead of checked change
cbBuy.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        if(objects.get(position).isSelected)
       {
              cbBuy.setChecked(false);
              objects.get(position).setSelected(false);

       }
       else
       {
              cbBuy.setChecked(true);
              objects.get(position).setSelected(true);

       }

    }
});


//For scrolling issue use this
if(objects.get(position).isSelected)
       {
              cbBuy.setChecked(true);

       }
       else
       {
              cbBuy.setChecked(false);
       }

            return view;

        }

    }