2013-09-14 5 views
0

Я осмотрелся, и есть некоторые подобные вопросы, но ни один из них не работает с рабочим решением.Удаление ListView элемента из списка и SharedPreferences

Я создал простой ListView для ввода ввода из EditText и отображения его в списке при нажатии кнопки. Если щелкнуть элемент списка, у меня появилось диалоговое окно и попросите подтвердить удаление. При нажатии «да» элемент удаляется. Хотя, если я попытаюсь удалить другой элемент, этот элемент удалит, но предыдущий элемент снова появится на своем месте. Я не знаю, как решить эту проблему. Из моего ограниченного понимания кажется, что элемент никогда не удаляется из SharedPreferences, и когда я загружаю их снова в следующий «onClick», старый элемент появляется снова. Хотя я попытался очистить SharedPreferences, а затем сохранил их после удаления, что не сработало.

package com.example.send2omni; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.text.AndroidCharacter; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 


public class ContextsList extends Activity { 

public static final String CONTEXTS = "contexts_list"; 

EditText display; 
ListView lv; 
public ArrayAdapter<String> adapter; 
Button addButton; 
String temp_appender; 
String appender = ""; 
List<String> dataset; 
String[] splitup; 
public String items; 
ArrayList<String> itemsarraylist; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.contexts_list); 

    display = (EditText) findViewById(R.id.editText); 
    lv = (ListView) findViewById(R.id.listView); 
    addButton = (Button) findViewById(R.id.bAdd); 
    LoadPreferences(); 
    lv.setAdapter(adapter); 
    LoadPreferences(); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); 

    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      appender = LoadPreferences(); 
      if(display.getText().toString() != null){ 
       temp_appender = display.getText().toString(); 
       String string_to_split = appender + "," + temp_appender; 
       List<String> items = Arrays.asList(string_to_split.split(",")); 
       adapter = new ArrayAdapter<String> 
(getApplicationContext(), android.R.layout.simple_list_item_1, items); 

       lv.setAdapter(adapter); 
       adapter.notifyDataSetChanged(); 
       SavePreferences("LISTS", string_to_split, null); 

       LoadPreferences(); 
      } 


      display.setText(""); 
     } 
    }); 

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

      deleteItem(arg1); 
     } 
    }); 

} 

protected void deleteItem(final View arg1) 
{ 
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); 
    dialogBuilder.setTitle("Delete"); 
    dialogBuilder.setMessage 
("Do you want to delete \"" + ((TextView) arg1).getText() + "\"?"); 
    dialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 


      String splitit = LoadPreferences(); 
      List<String> listit = Arrays.asList(splitit.split(",")); 
      ArrayList<String> itemsarraylist = new ArrayList<String>(); 
      for(int i = 0; i <listit.size(); i++){ 
       itemsarraylist.add(i, listit.get(i)); 
      } 


      try { 
       adapter.remove(((TextView) arg1).getText().toString()); 
       adapter.notifyDataSetChanged(); 
       itemsarraylist.remove(((TextView) arg1).getText().toString()); 


       try{ 
        SavePreferences("LISTS", null, itemsarraylist); 


       }catch(Exception e){ 

       } 
      } catch (Exception e) { 


       Log.e("remove", "failed"); 
      } 



     } 


    }); 
    dialogBuilder.setNeutralButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

     } 
    }); 
    AlertDialog deleteDialog = dialogBuilder.create(); 
    deleteDialog.show(); 
} 


protected void SavePreferences(String key, String value, ArrayList<String> opt) { 
    // TODO Auto-generated method stub 
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this); 

    if (opt != null){ 
     for (int i = 0 ; i <= opt.size(); i++) 
      value += opt.get(i) + ","; 
    } 

    SharedPreferences.Editor editor = data.edit(); 
    editor.putString(key, value); 
    editor.commit(); 


} 

protected String LoadPreferences(){ 
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this); 
    String dataSet = data.getString("LISTS", ""); 
    dataset = Arrays.asList(dataSet.split(",")); 
    splitup = dataSet.split(","); 



    List<String> items = Arrays.asList(dataSet.split(",")); 
    ArrayList<String> itemsarraylist = new ArrayList<String>(); 
    for(int i = 0; i <items.size(); i++){ 
     itemsarraylist.add(i, items.get(i)); 
    } 
    adapter = new ArrayAdapter<String> 
    (this, android.R.layout.simple_list_item_1, itemsarraylist); 

    lv.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 

    return dataSet; 

} 

} 

Я включил весь код из класса, только в случае, если у вас есть время, чтобы попробовать его в вашем IDE, и потому, что рабочая часть может быть полезной для других начинающих.

Я не могу выразить, насколько я благодарен, если кто-нибудь может помочь мне исправить это. Это в значительной степени последний шаг, который я должен предпринять, прежде чем завершить свое первое приложение, и я действительно не ожидаю, что вам придется изучать SQLite, чтобы сохранить список строк.

Спасибо за ваше время все ..

+0

Вы код нуждается в большом количестве очистки. Вы создаете много ненужных объектов. –

+0

Я знаю, я в основном пытался все, что мог, чтобы заставить его работать, и он очень запутан. Мне, вероятно, придется очистить его, прежде чем я смогу ожидать каких-либо ответов. – domi91c

+0

Я предполагаю, что вы не можете понять это? – domi91c

ответ

2

Вам нужно изменить

for (int i = 0 ; i <= opt.size(); i++) { 

на линии 178 до

for (int i = 0 ; i < opt.size(); i++) { 

Вы должны пятнистый ArrayIndexOutofBounds исключение, но так как вы ловли он в строке 145 и не печатает стопку, вы ее никогда не увидите.

EDIT: Возможно, вам также потребуется удалить ",", который вы добавляете к значениям. Что-то вроде этого должно работать

value += opt.get(i); 
if (i != opt.size() - 1) 
    value += ","; 
+0

Вау, это было просто. Большое вам спасибо, я, очевидно, многому научился, но я ценю время, когда вы спасли меня! – domi91c

+0

@ mt.sinai Если вы только что напечатали трассировку стека, вам не нужно было задавать вопрос. Просто поместите 'e.printStackTrace()' в блок catch. –

+0

@ mt.sinai Кроме того, не используйте 'getApplicationContext()' для получения текущего 'Context'. Просто используйте обычный 'Context', который вы получите с помощью' this'. В вашем случае это будет 'ContextsList.this'. –

Смежные вопросы