保存RecyclerView状态

时间:2015-10-23 15:40:17

标签: android android-recyclerview

我正在使用RecylerView创建一个应用程序,其中填充了来自在线服务器的数据。它有一个带有收藏夹按钮的自定义布局,单击该图标时会发生更改。我在使用RecyclerView时尝试保存所选视图的状态时出现问题。 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
                }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我几天前遇到过这个问题 - 原因是你没有用适用的更改更新你的feedItemList。如果您通过设置Latest类的一些成员变量(如setExcerpt())更新列表,那么您的recyclerview将正常工作。