2017-04-19 109 views
0

我知道這個問題已經被問了很多次了,但是我找不到解決我的問題的方法。將項目保存到共享首選項後,listview laggy滾動

我有一個列表視圖與書籤圖標在每一行,這將保存我選擇的項目共享偏好onClick。我滾動我的列表視圖沒有問題,直到我點擊一個項目保存到共享偏好,然後我有一個滾動和事件的故障,如果我從我的共享首選項中刪除該項目,我仍然會有這樣的小故障。直到我卸載並重新安裝應用程序或清除應用程序的緩存。

適配器

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

共享縣

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

使用a pply().. commit()會阻止你的線程.. – ZeroOne

回答

1

我剛修好你的SharedPreference類..避免使用commit()和避免屢初始化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; 
    } 
} 
+0

感謝您的回覆,我試過'應用()',但問題仍然存在 – Mehran

+0

我修復您的共享類..嘗試看看 – ZeroOne

+0

就是這樣,謝謝人。 – Mehran