2015-10-23 2 views
0

Я делаю приложение с RecylerView, заполненным данными из онлайн-сервера. У него есть настраиваемый макет с любимой кнопкой, которая при нажатии на значок меняется. У меня проблема с попыткой сохранить состояние выбранного представления в RecyclerView. RecyclerView не сохраняет выбранное состояние при прокрутке назад. Незлая помощь.Save State of RecyclerView

Модель Класс

package com.smartdevelopers.kandie.nicedrawer.newsModel; 

/** 
* Created by 4331 on 25/09/2015. 
*/ 
public class Latest { 
    public String excerpt; 
    public String articleImage; 
    public String articleUrl; 
    public boolean mfavourite; 



    public boolean isFavourite(){ 
     return mfavourite; 
    } 

    public String getArticleUrl() { 
     return articleUrl; 
    } 

    public void setArticleUrl(String articleUrl) { 
     this.articleUrl = articleUrl; 
    } 

    public String getExcerpt() { 
     return excerpt; 
    } 

    public void setExcerpt(String excerpt) { 
     this.excerpt = excerpt; 
    } 

    public String getArticleImage() { 
     return articleImage; 
    } 

    public void setArticleImage(String articleImage) { 
     this.articleImage = articleImage; 
    } 
} 

адаптер

package com.smartdevelopers.kandie.nicedrawer.newsAdapter; 

import android.content.Context; 
import android.content.Intent; 
import android.graphics.Color; 
import android.support.v7.widget.RecyclerView; 
import android.text.Html; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.nispok.snackbar.Snackbar; 
import com.nispok.snackbar.SnackbarManager; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.smartdevelopers.kandie.nicedrawer.R; 
import com.smartdevelopers.kandie.nicedrawer.ReadArticleActivity; 
import com.smartdevelopers.kandie.nicedrawer.newsModel.Latest; 
import com.smartdevelopers.kandie.nicedrawer.util.SharedPreferenceRecycler; 

import java.util.HashMap; 
import java.util.List; 

/** 
* Created by 4331 on 29/09/2015. 
*/ 
public class OtherNewsAdapter extends RecyclerView.Adapter<OtherNewsAdapter.ViewHolder> { 
    private List<Latest> feedItemList; 
    private Context mContext; 
    private static final String TAG = "ActivityGplus"; 
    SharedPreferenceRecycler sharedPreference = new SharedPreferenceRecycler(); 
    public OtherNewsAdapter(Context context, List<Latest> feedItemList) { 
     this.feedItemList = feedItemList; 
     this.mContext = context; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_other_news, null); 
     ViewHolder mh = new ViewHolder(v); 
     return mh; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder viewHolder, int i) { 
     final Latest feedItem = feedItemList.get(i); 
     ImageLoader imageLoader = ImageLoader.getInstance(); 
     DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
       .cacheOnDisc(true).resetViewBeforeLoading(true) 
       .showImageForEmptyUri(R.drawable.placeholder) 
       .showImageOnFail(R.drawable.placeholder) 
       .showImageOnLoading(R.drawable.placeholder).build(); 

     //download and display image from url 
     imageLoader.displayImage(feedItem.getArticleImage(), viewHolder.thumbnail, options); 

//  Glide.with(mContext).load(feedItem.getArticleImage()) 
//    .error(R.drawable.placeholder) 
//    .placeholder(R.drawable.placeholder) 
//    .into(viewHolder.thumbnail); 

     viewHolder.title.setText(Html.fromHtml(feedItem.getExcerpt())); 

    viewHolder.articleUrl.setText(Html.fromHtml(feedItem.getArticleUrl())); 

     viewHolder.title.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(mContext, ReadArticleActivity.class); 
       intent.putExtra("articleUrl", viewHolder.articleUrl.getText().toString()); 
       mContext.startActivity(intent); 
      } 
     }); 
     /*If a product exists in shared preferences then set heart_red drawable 
     * and set a tag*/ 
      if (checkFavoriteItem(feedItem)) { 
       viewHolder.favImage.setImageResource(R.drawable.heart_red); 
       viewHolder.favImage.setSelected(true); 
       viewHolder.favImage.setTag("red"); 
       hashMap.get(i); 
      } 
     else { 
       viewHolder.favImage.setImageResource(R.drawable.heart_grey); 
       viewHolder.favImage.setSelected(false); 
       viewHolder.favImage.setTag("grey"); 
     } 
     viewHolder.title.setTag(viewHolder); 
     viewHolder.thumbnail.setId(R.id.otherImage); 
     viewHolder.articleUrl.setTag(viewHolder); 
    } 
    @Override 
    public int getItemCount() { 
     return (null != feedItemList ? feedItemList.size() : 0); 
    } 
    @Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 
    View.OnClickListener clickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      OtherNewsRowHolder holder = (OtherNewsRowHolder) view.getTag(); 
      int position = holder.getPosition(); 
      Latest feedItem = feedItemList.get(position); 
      Toast.makeText(mContext, feedItem.getExcerpt(), Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    /*Checks whether a particular product exists in SharedPreferences*/ 
    public boolean checkFavoriteItem(Latest checkProduct) { 
     boolean check = false; 
     List<Latest> favorites = sharedPreference.getFavorites(mContext); 
     if (favorites != null) { 
      for (Latest product : favorites) { 
       if (product.equals(checkProduct)) { 
        check = true; 
        break; 
       } 
      } 
     } 
     return check; 
    } 
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     protected ImageView thumbnail, favImage; 
     protected TextView title,articleUrl; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      this.thumbnail = (ImageView) itemView.findViewById(R.id.otherImage); 
      this.title = (TextView) itemView.findViewById(R.id.otherExcerpt); 
      this.articleUrl=(TextView)itemView.findViewById(R.id.otherUrl); 
      this.favImage = (ImageView) itemView.findViewById(R.id.imgbtn_favorite); 
      favImage.setOnClickListener(this); 
     } 
     @Override 
     public void onClick(View v) { 

      String tag = favImage.getTag().toString(); 
      if(!favImage.isSelected()) { 
       if (tag.equalsIgnoreCase("grey")) { 
        sharedPreference.addFavorite(mContext, feedItemList.get(getItemCount() - 1)); 
//     Toast.makeText(mContext,      mContext.getResources().getString(R.string.add_favr), 
//       Toast.LENGTH_SHORT).show(); 
        //SnackBack 
        SnackbarManager.show(
          Snackbar.with(mContext) 
            .text(R.string.add_favr) 
            .textColor(Color.WHITE) 
            .color(Color.RED) 
        .duration(Snackbar.SnackbarDuration.LENGTH_SHORT)); 
        //End of SnackBack 
        favImage.setTag("red"); 
        favImage.setImageResource(R.drawable.heart_red); 
       } 
      } 
       else { 
        sharedPreference.removeFavorite(mContext, feedItemList.get(getItemCount() - 1)); 

        favImage.setTag("grey"); 
        favImage.setImageResource(R.drawable.heart_grey); 
       //SnackBack 
       SnackbarManager.show(
         Snackbar.with(mContext) 
           .text(R.string.remove_favr) 
           .textColor(Color.WHITE) 
           .color(Color.RED)      .duration(Snackbar.SnackbarDuration.LENGTH_SHORT).animation(false)); 
       //End of SnackBack 
       } 
     } 
    } 
} 
+0

Вы решили проблему? –

ответ

0

Я столкнулся с этой проблемой несколько дней назад - причина в том, что вы не обновили feedItemList с соответствующими изменениями. Если вы обновите список, установив некоторые из переменных-членов (например, setExcerpt()) класса New после его изменения, ваш recyclerview будет работать правильно.