0

Ich weiß, dass diese Frage oft gestellt wurde, aber ich konnte keine Lösung für mein Problem finden.listview laggy Scroll nach dem Speichern eines Elements in gemeinsamen Einstellungen

Ich habe eine Listenansicht mit einem Lesezeichen-Symbol in jeder Zeile, die mein ausgewähltes Element in freigegebene Einstellungen onClick speichert. Ich habe kein Problem mit dem Scrollen meiner Listenansicht, bis ich auf ein einzelnes Element klicke, um es in freigegebene Einstellungen zu speichern. Dann habe ich einen Fehler beim Scrollen und Ereignis, wenn ich dieses Element aus meinen freigegebenen Einstellungen entferne. bis ich die Anwendung deinstalliere und neu installiere oder den Cache der App lösche.

Adapter

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.android_hive_list_row, null); 

     holder.title = (TextView) convertView.findViewById(R.id.title); 
     holder.rating = (TextView) convertView.findViewById(R.id.rating); 
     holder.genre = (TextView) convertView.findViewById(R.id.genre); 
     holder.year = (TextView) convertView.findViewById(R.id.releaseYear); 
     holder.playPauseHive=(ImageView)convertView.findViewById(R.id.playPauseHive); 
     holder.favoriteImgHive = (ImageView) convertView.findViewById(R.id.favImageHive); 

     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    Product m = movieItems.get(position); 


    holder.title.setText(m.getTitle()); 
    holder.rating.setText("Rating: " + String.valueOf(m.getRating())); 

    String genreStr = ""; 
    for (String str : m.getGenre()) { 
     genreStr += str + ", "; 
    } 
    genreStr = genreStr.length() > 0 ? genreStr.substring(0,genreStr.length() - 2) : genreStr; 
    holder.genre.setText(genreStr); 
    holder.year.setText(String.valueOf(m.getYear())); 


    holder.favoriteImgHive.setImageResource(m.getFavId()); 
    holder.favoriteImgHive.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (callback != null) { 
       callback.favOnClick(position,v);; 
      } 
     } 
    }); 


    if (checkFavoriteItem(m)) { 
     holder.favoriteImgHive.setImageResource(R.mipmap.bookmarked); 
     holder.favoriteImgHive.setTag("red"); 
     notifyDataSetChanged(); 
    } else { 
     holder.favoriteImgHive.setImageResource(R.mipmap.bookmark_border); 
     holder.favoriteImgHive.setTag("grey"); 
     notifyDataSetChanged(); 
    } 





    return convertView; 
} 



/*Checks whether a particular product exists in SharedPreferences*/ 
public boolean checkFavoriteItem(Product checkProduct) { 
    boolean check = false; 
    List<Product> favorites = sharedPreference.getFavorites(activity); 
    if (favorites != null) { 
     for (Product product: favorites) { 
      if (product.equals(checkProduct)) { 
       check = true; 
       notifyDataSetChanged(); 
       break; 
      } 
     } 
     notifyDataSetChanged(); 
    } 
    return check; 
} 

Geteilt Pref

public class SharedPreference { 

public static final String PREFS_NAME = "PRODUCT_APP"; 
public static final String FAVORITES = "Favorite_Tones"; 

public SharedPreference() { 
    super(); 
} 

// This four methods are used for maintaining favorites. 
public void saveFavorites(Context context, List<Product> favorites) { 
    SharedPreferences settings; 
    Editor editor; 
    settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE); 
    editor = settings.edit(); 
    Gson gson = new Gson(); 
    String jsonFavorites = gson.toJson(favorites); 
    editor.putString(FAVORITES, jsonFavorites); 
    editor.commit(); 
} 

public void addFavorite(Context context, Product product) { 
    List<Product> favorites = getFavorites(context); 
    if (favorites == null) 
     favorites = new ArrayList<Product>(); 
    favorites.add(product); 
    saveFavorites(context, favorites); 
    Log.w("addPrefLog", favorites.toString()); 
} 

public void removeFavorite(Context context, Product product) { 
    ArrayList<Product> favorites = getFavorites(context); 
    if (favorites != null) { 
     favorites.remove(product); 
     saveFavorites(context, favorites); 
    } 
} 

public ArrayList<Product> getFavorites(Context context) { 
    SharedPreferences settings; 
    List<Product> favorites; 
    settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE); 
    if (settings.contains(FAVORITES)) { 
     String jsonFavorites = settings.getString(FAVORITES, null); 
     Gson gson = new Gson(); 
     Product[] favoriteItems = gson.fromJson(jsonFavorites,Product[].class); 
     favorites = Arrays.asList(favoriteItems); 
     favorites = new ArrayList<Product>(favorites); 
    } else 
     return null; 

    return (ArrayList<Product>) favorites; 
    } 
} 
+1

Verwenden Sie a pply() .. commit() wird deinen Thread blockieren. – ZeroOne

Antwort

1

ich fix nur Ihre SharedPreference Klasse .. vermeiden begehen() verwenden und vermeiden repeatly Ihre sharedPreferences

public class SharedPreference { 

    public static final String PREFS_NAME = "PRODUCT_APP"; 
    public static final String FAVORITES = "Favorite_Tones"; 

    SharedPreferences settings; 
    SharedPreferences.Editor editor; 
    Gson gson = new Gson(); 

    @SuppressLint("CommitPrefEdits") 
    public SharedPreference(Context context) { 
     settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
     editor = settings.edit(); 
    } 

    // This four methods are used for maintaining favorites. 
    public void saveFavorites(List<Product> favorites) { 
     String jsonFavorites = gson.toJson(favorites); 
     editor.putString(FAVORITES, jsonFavorites); 
     editor.apply(); 
    } 

    public void addFavorite(Product product) { 
     List <Product> favorites = getFavorites(); 
     if (favorites == null) 
      favorites = new ArrayList <Product>(); 
     favorites.add(product); 
     saveFavorites(favorites); 
     Log.w("addPrefLog", favorites.toString()); 
    } 

    public void removeFavorite(Product product) { 
     ArrayList <Product> favorites = getFavorites(); 
     if (favorites != null) { 
      favorites.remove(product); 
      saveFavorites(favorites); 
     } 
    } 

    public ArrayList <Product> getFavorites() { 
     if (settings.contains(FAVORITES)) { 
      String jsonFavorites = settings.getString(FAVORITES, null); 
      Product[] favoriteItems = gson.fromJson(jsonFavorites, Product[].class); 
      favorites = Arrays.asList(favoriteItems); 
      favorites = new ArrayList <Product> (favorites); 
     } else 
      return null; 

     return (ArrayList <Product>) favorites; 
    } 
} 
zu initialisieren
+0

Danke für die Antwort, ich habe 'apply()' versucht, aber das Problem ist immer noch da – Mehran

+0

ich repariere deine gemeinsame Klasse .. versuche einen Blick zu werfen – ZeroOne

+0

Das war's, danke Mann. – Mehran

Verwandte Themen