2017-04-15 3 views
-1

Ich benutze GSON, um JSON in SharedPreferences zu speichern, ich habe eine Methode, die die gepulste Zeile aus der ListView löscht, Wie kann ich auch die sharedPreferences aus dieser geklappten Zeile löschen?Wie lösche SharedPreferences von ausgewählten ListView

ListViewNews.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) {  
       switch (event.getAction()) { 
        ...  
        case MotionEvent.ACTION_UP: 
         if (event.getX() - historicX < -DELTA) { 
          ...  
          alertDialogBuilder.setPositiveButton("Yes",new DialogInterface. OnClickListener() { 
           public void onClick(DialogInterface dialog, int id) { 
            newsAdapter.FunctionDeleteRowWhenSlidingLeft(position);  

            **ATTEMPT OF DELETION** 
            //Delete from Database 
            SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
            SharedPreferences.Editor editor = sharedPrefs.edit(); 
            Gson gson = new Gson(); 
            String json = sharedPrefs.getString(TAG, null); 
            News news = gson.fromJson(json, News.class); 

            News selItem = (News) newsAdapter.getItem(position); 

            //read 
            News news2 = gson.fromJson(json, News.class); 
            System.out.println("---"+news2.getStory_id()+"---"); 

            /* 
            This deletes everything 
            editor.remove("HackerNews"); 
            */ 

            editor.commit(); 
            editor.apply(); 

            //read 
            sharedPrefs.getString("json", ""); 
            System.out.println("SP"+sharedPrefs.getAll()); 
           } 
          ... 
+0

machen Welche Art von Daten ist Ihre ListView gemacht? Sind diese Daten in einem einzigen JSON gespeichert? Ist es möglich, den Schlüsselwert SharedPreferences zu überschreiben, oder müssen Sie ihn einfach ändern? Ich denke, ich kann helfen, aber ich muss die Antwort für diese Fragen wissen :) –

+0

@ S.Czop meine Listenansicht besteht aus GSON Strings in SharedPreferences gespeichert, so werden sie gespeichert: 'news = new News (story_id, story_title, autor, erstellt_at, story_url); // Hinzufügen von JSON SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences (context); SharedPreferences.Editor Editor = sharedPrefs.edit(); Gson gson = neuer Gson(); String json = gson.toJson (Nachrichten); Editor.putString (TAG, JSON); editor.commit(); // lesen Nachrichten news2 = gson.fromJson (json, News.class); // Hinzufügen von SharedPreferences newsAdapter.add (news2); ' – Schavcovsky

Antwort

0

Mein Vorschlag/Lösung:

  • ein ArrayList<News> newsList erstellen, die jede Nachricht hält, die in Ihrem ListView gezeigt werden.
  • Speichern newsList in SharedPreferences, und verwenden Sie es auch, um Ihren Adapter für die ListView zu erstellen.
  • Um ein Element in newsList zu löschen, rufen Sie die in SharedPreferences gespeicherte Liste unter einem neuen Namen auf, z. B. newsListNew.
  • Finden Sie den Artikel in newsListNew mit einem iterator und entfernen Sie es.
  • Klar newsList
  • hinzufügen alle newsListNew zu newsList
  • die Änderung an den Adapter diesem Artikel, so aktualisiert er die ListView.
  • Überschreiben Sie die SharedPreferences.

Dies ist, was ich derzeit für mein aktuelles Projekt verwende. Der ListView sollte mit einer Reihe von Daten arbeiten, eine ArrayList sollte Ihre Wahl sein, anstatt einen SharedPreferences-Speicher für jede Ihrer News zu erstellen. Auf diese Weise vermeiden Sie, auf den SharedPreferences irgendwie zu iterieren, und stattdessen arbeiten Sie mit ArrayList, die jedem etwas vertrauter ist. Wenn ich einen Entwurf davon machen hätte, würde es so aussehen:

public class MainActivity extends AppCompatActivity { 

ArrayList<News> newsList, newsListNew; 
MyCustomAdapter adapter; //Can be an ArrayAdapter or Custom Adapter 

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

//Initialize the main ArrayList 
Gson gson = new Gson(); 
     SharedPreferences prefs = getSharedPreferences(
       "com.example.app", Context.MODE_PRIVATE); 
     String json = prefs.getString("newsList", null); 
     if (json == null) { 
      newsList = new ArrayList<>(); 
     } else { 
      Type type = new TypeToken<ArrayList<News>>(){}.getType(); 
      newsList = gson.fromJson(json, type); 
     } 

//Attach the adapter 
adapter = new MyCustomAdapter(this, newsList) 
listView = (ListView)findViewById(R.id.listView); 
listView.setAdapter(adapter); 

} 


//Method for removing a News 
    public void deleteNews(String id) { 

Gson gson = new Gson(); 

SharedPreferences prefs = getSharedPreferences(
     "com.example.app", Context.MODE_PRIVATE); 
String json = prefs.getString("newsList", null); 
if (json == null) { 
    newsListNew = new ArrayList<>(); 
} else { 
    Type type = new TypeToken<ArrayList<News>>(){}.getType(); 
    newsListNew = gson.fromJson(json, type); 
} 

for(Iterator<News> iterator = newsListNew.iterator(); iterator.hasNext();) { 
News news = iterator.next(); 
if (news.id == id) { //Look for the News element 
iterator.remove(); //Remove the News from the ArrayList 
break; //Include break if the Id is unique, remove it if the Id might repeat 
} 
} 

newsList.clear(); //Empty the main ArrayList 
newsList.addAll(newsListNew); //Replace the ArrayList with new info 
adapter.notifyDataSetChanged(); //Update the ListView UI 
//Save the newsList again into SharedPreferences by turning it into a JSON, as you normally do 

} 

Es könnte die Idee zu tun .clear verwirrend sein() und dann .addAll(), aber überraschend, wenn man nicht Wenn sie eingeschlossen werden, würde notifyDataSetChanged() nicht immer funktionieren. Ich hoffe, das funktioniert, fühlen Sie sich frei, mich etwas extra zu fragen, und ich kann eine Bearbeitung der Antwort

Verwandte Themen