2017-05-31 30 views
0

我試圖瞭解如何創建應用程序的列表視圖,我有應用程序顯示項目,圖像和複選框的列表視圖。當應用程序關閉時共享偏好列表視圖不工作

我試圖實現的是:當他們點擊複選框時,下次打開該應用程序時會保存該狀態。我認爲我的代碼是正確的,但不知道什麼是錯誤的,因爲當我重新打開應用程序時,所有的複選框都被選中爲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 Product { 
String name; 
String price; 
int image; 
boolean isSelected = false; 

public boolean isSelected() { 
    return isSelected; 
} 
public void setSelected(boolean selected) 
{ 
    isSelected = selected; 
} 


Product(String _describe, String _price, int _image, boolean _box) { 
    name = _describe; 
    price = _price; 
    image = _image; 
    isSelected = _box; 
} 


} 

主要活動

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", "5%", 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(); 
}*/ 
} 
+0

試圖調試代碼? – jagapathi

+0

是的,但沒有出現它 – 77rshah

+0

嘿,我認爲你在你添加的產品相同的名稱 – Sheychan

回答

1

如果妳希望管理你的產品使用SharedPreference不是U可以這樣做

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", "5%", 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; 
    } 


} 

適配器getView()方法:

@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; 

     } 

    } 

無需維護單個產品價值sharepreference。

希望這將有助於u..if你仍然面臨的問題,我們將尋找其他方式

+0

對於Gson,你可以使用這個依賴compile'c​​om.google.code.gson:gson:2.6。 2' –

+0

這也有效,我找到了另一種方式。只需在onClicked內添加if(object.get(position).isselected)並設置共享首選項就可以了。 – 77rshah

+0

偉大的你已經解決了這個問題...高興地幫助你...享受 –