この質問は何度も尋ねられましたが、私の問題の解決策は見つかりませんでした。リストビューは、共有設定に項目を保存した後にスクロールします
すべての行にブックマークアイコンが付いたリストビューがあり、選択したアイテムが共有設定のonClickに保存されます。私はリストビューをスクロールしても、共有設定に保存するために1つのアイテムをクリックするまでは問題ありません。共有された環境設定からそのアイテムを削除した場合、スクロールとイベントに不具合があります。アプリケーションをアンインストールしてから再インストールするか、アプリのキャッシュをクリアするまで。
アダプタ
@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;
}
}
を使用pply()..あなたのスレッドをブロックします.. – ZeroOne