2016-09-30 2 views
0

Ich habe eine benutzerdefinierte Listenansicht mit Textansicht und Kontrollkästchen. Ich möchte den Checkbox-Status in geteilten Preferences speichern und den Adapter bei geöffneter Aktivität erneut abrufen und setzen. Ich habe das auch getan, aber Problem ist das: Ich speichere die Checkbox überprüfte Position in geteilten Präferenzen und bekomme es. Wenn sich die Listenansichtsposition ändert, wurde die Checkbox-Position falsch markiert. Wie kann ich damit umgehen?Android Speichern Sie benutzerdefinierte ListView Checkbox-Status in sharedpreferences Problem

Adaptercode:

public class Listadapter extends BaseAdapter { 
    CheckBox checkBox; 
    boolean index[]; 
    boolean[] itemChecked; 
    ResolveInfo entry; 
    String[] itempkg; 
    private Context mContext; 
    private List<ResolveInfo> mListAppInfo; 
    private PackageManager mPackManager; 
    private ArrayList<Boolean> checkList = new ArrayList<Boolean>(); 

    public Listadapter(Context applicationContext, List<ResolveInfo> installedApplication, PackageManager packageManager) 
    { 
     //super(applicationContext,textViewResourceId,installedApplication); 
     super(); 
     this.mContext = applicationContext; 
     this.mListAppInfo = installedApplication; 
     index = new boolean[installedApplication.size()]; 
     this.mPackManager = packageManager; 
     for (int i = 0; i < installedApplication.size(); i++) { 
      checkList.add(false); 
      itemChecked = new boolean[installedApplication.size()]; 
      itempkg = new String[installedApplication.size()]; 
     } 
    } 
    @Override 
    public int getCount() 
    { 
     return mListAppInfo.size(); 
     //return ((null != mListAppInfo) ? mListAppInfo.size() : 0); 
    } 
    @Override 
    public Object getItem(int position) 
    { 
     // index = new boolean[mListAppInfo.size()]; 
     return mListAppInfo.get(position); 
    } 
    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) 
    { 
     final ViewHolder holder; 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_item, null); 
      holder = new ViewHolder(); 
      // reference to convertView 
      holder.tvAppName = (TextView) convertView 
        .findViewById(R.id.textView1); 
      holder.tvPkgName = (TextView) convertView 
        .findViewById(R.id.textView); 
      holder.checkBox = (CheckBox) convertView 
        .findViewById(R.id.checkBox1); 
      holder.ivAppIcon = (ImageView) convertView 
        .findViewById(R.id.imageView); 
      convertView.setTag(holder); 
     } else { 

      holder = (ViewHolder) convertView.getTag(); 
     } 
     entry = mListAppInfo.get(position); 
     holder.ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager)); 
     holder.tvAppName.setText(entry.loadLabel(mPackManager)); 
     holder.tvPkgName.setText(entry.activityInfo.packageName); 
     holder.checkBox.setChecked(false); 

     if (itemChecked[position]) 
      holder.checkBox.setChecked(true); 
     else 
      holder.checkBox.setChecked(false); 

     final View finalConvertView = convertView; 
     holder.checkBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if (holder.checkBox.isChecked()) { 
        itemChecked[position] = true; 

       } else { 
        itemChecked[position] = false; 
       } 
      } 
     }); 
     return convertView; 
    } 
    public void setItemChecked5(boolean[] items5) { 
     itemChecked = items5; 
    } 
    private class ViewHolder 
    { 
     private ImageView ivAppIcon; 
     private TextView tvAppName; 
     private TextView tvPkgName; 
     private CheckBox checkBox; 
    } 
} 

Aktivitätscode:

public class Profile5Activity extends AppCompatActivity implements AdapterView.OnItemClickListener { 

      ListView apps5; 
      PackageManager packageManager5; 
      static ArrayList<String> checkedValue5; 
      Button bt5; 
      ResolveInfo pi5 = new ResolveInfo(); 
      Context context = this; 
      static String currentApp5 = "NULL"; 
      CheckBox cb5; 
      Listadapter Adapter5 = null; 
      boolean[] itemChecked5; 

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

      itemChecked5 = new boolean[AllApps.getInstalledApplication(this).size()]; 
      //needPermissionForBlocking(MainActivity.mainContext); 
      apps5 = (ListView) findViewById(R.id.list5); 
      packageManager5 = getPackageManager(); 

SharedPreferences preferencess2 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE); 
     Set<String> seta = preferencess2.getStringSet("pkgname5", null); 
     if (seta != null && !seta.isEmpty() && !seta.equals("null")) { 
      checkedValue5 = new ArrayList<String>(seta); 
     } 
     else 
     { 
      checkedValue5 = new ArrayList<String>(); 
     } 


      final boolean[] items5 = new boolean[AllApps.getInstalledApplication(this).size()]; 

      SharedPreferences preferences5 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE); 
      for (int i = 0; i < AllApps.getInstalledApplication(this).size(); ++i) { 
       items5[i] = preferences5.getBoolean("checkbox_5" + i, false); 
      } 

      Adapter5 = new Listadapter(this, AllApps.getInstalledApplication(this), packageManager5); 
      Adapter5.setItemChecked5(items5); 
      apps5.setAdapter(Adapter5); 
      apps5.setOnItemClickListener(this); 

     } 

     @Override 
     public void onItemClick(AdapterView<?> arg0, final View v, final int position, long arg3) 
     { 
      // TODO Auto-generated method stub 

      cb5 = (CheckBox) v.findViewById(R.id.checkBox1); 
     final TextView tv5 = (TextView) v.findViewById(R.id.textView); 
     final TextView tvv5 = (TextView) v.findViewById(R.id.textView1); 
     //pi5 = (ResolveInfo) arg0.getItemAtPosition(position); 
     cb5.performClick(); 

     if (cb5.isChecked()) { 
      checkedValue5.add(tv5.getText().toString()); 
      itemChecked5[position] = true; 
      String pname = (tvv5.getText().toString()); 
      SharedPreferences preferences1 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE); 
      SharedPreferences.Editor edit = preferences1.edit(); 
      Set<String> setttt1 = new HashSet<String>(); 
      setttt1.addAll(checkedValue5); 
      edit.putBoolean("checkbox_5" + position, true); 
      edit.putStringSet("pkgname5", setttt1); 
      edit.commit(); 

     } else if (!cb5.isChecked()) { 
      checkedValue5.remove(tv5.getText().toString()); 
      String pname = (tvv5.getText().toString()); 
      SharedPreferences preferences1 = context.getSharedPreferences("YOUR_APP_NAME5", Context.MODE_PRIVATE); 
      SharedPreferences.Editor edit = preferences1.edit(); 
      Set<String> setttt1 = new HashSet<String>(); 
      setttt1.addAll(checkedValue5); 
      edit.putBoolean("checkbox_5" + position, false); 
      edit.putStringSet("pkgname5", setttt1); 
      edit.commit(); 
     } 
    } 
    } 

Alles funktioniert gut in diesem Code, bis der Listenposition Positionswechsel, wenn Listenposition Position dann änderte ich falsch verstanden Überprüfter Wert. Bitte hilf mir mit Code oder bearbeite meinen Code wo ich Fehler gemacht habe.

+0

Warum Sie Text angehängt werden '„checkbox_5“' mit die boolesche Position beim Speichern in geteilter Voreinstellung? – GrIsHu

+0

@GrIsHu ich speichere den checkbox status in sharedprefrences werde dir bitte sagen wie kann ich das mit etwas code umgehen. – xtylish

+0

Ja, ich weiß, dass Sie den Checkbox-Status speichern, aber ich sage, dass Sie nur die Position nur als Schlüssel speichern sollten, während Sie die Position speichern, indem Sie einen Text hinzufügen. Was ich denke, könnte zu einem Problem führen. Versuchen Sie wie folgt 'edit.putBoolean (" "+ Position, false);' – GrIsHu

Antwort

0

Ich habe gleiches Problem für die ich verwendet habe folgende:

Dafür habe ich Artikel Detail in sharedpreferences gespeichert und als ich Wert in der Liste hinzufügen, habe ich geprüft (Vergleichswert mit neuer Arraylist (mit Schleife)), dann Artikel wird Liste hinzugefügt, dann wird es funktionieren.

+0

werden Sie mir bitte mit mehr Details erzählen? oder irgendein Code – xtylish

1

Um zu wissen, welches Element geprüft wird, sollten Sie den eindeutigen und konstanten Wert jedes Elements speichern (die Position in Ihrem Fall ist einzigartig, aber nicht konstant, da sie sich ändern kann). Mit anderen Objekttyp immer id

Aber in Ihrem Fall verwenden wir, ist das Element ResolveInfo so können Sie entry.activityInfo.packageName-SharedPrefrences sparen, weil es unter allen Artikeln diffirent ist

+0

Ich habe meinen Tätigkeitscode redigieren bitte überprüfen Sie es und sagen Sie mir, dass ich Recht mache? – xtylish

+0

Ich mache das so, aber wenn die Position des Listeneintrags geändert wird, dann wird meine Checkbox-Position, die das Problem verursacht, Ihnen bitte sagen, wie ich den Checkbox-Status in geteilten Präferenzen wie pkgname speichern kann – xtylish

Verwandte Themen