保持Recycler View中项目的状态

3
我有一个RecyclerView,它从API中填充数据。每一行都有一个喜欢按钮,用户可以按下并改变图标的颜色。
当用户按下按钮时,它运作得很好,但是当他向上滚动页面然后回到喜欢的行时,喜欢就消失了,看起来好像从未被按过一样。
我该如何保持这个“喜欢”的状态?
public class SocialAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    ...

    public SocialAdapter(Context context, JSONArray pages){
        mContext = context;
        mPages = pages;
...
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.social_row, parent, false);
        MyHolder holder=new MyHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        MyHolder myHolder= (MyHolder) holder;

        try {
            JSONObject mpackid = mPages.getJSONObject(position);

            //myHolder.button_like.setText("Eu quero!");
            myHolder.button_like.setEnabled(true);
            myHolder.button_like.setBackground(mContext.getResources().getDrawable(R.drawable.empty_star));
            myHolder.number_likes.setText(mpackid.optJSONObject("info").optString("likes")+" foo");
            myHolder.number_likes.setTextColor(Color.parseColor("#525252"));

            myHolder.user_name.setText(mpackid.optString("user_full_name"));
            myHolder.user_text.setText(mpackid.optJSONObject("info").optString("text"));
            myHolder.feed_id.setText(mpackid.optJSONObject("info").optString("feed_suggestion_id"));
            myHolder.number_likes.setText(mpackid.optJSONObject("info").optString("likes")+" foo");
            myHolder.like_int.setText(mpackid.optJSONObject("info").optString("likes"));

            myHolder.tags.setText("#"+mpackid.optJSONObject("info").optJSONArray("tags").toString().replace("[", "").replace("]", "").replace("\"",""));
            myHolder.date.setText(mpackid.optJSONObject("info").optString("elapsed_time"));

            String likes = mpackid.optJSONObject("info").optJSONArray("liked_by").toString().replace("[", "").replace("]", "").replace("\"","");

            if(likes.contains(mUserId)){
                myHolder.button_like.setEnabled(false);
                myHolder.button_like.setBackground(mContext.getResources().getDrawable(R.drawable.filled_star));
                myHolder.number_likes.setText("foo "+mpackid.optJSONObject("info").optString("likes")+" foo");
                myHolder.number_likes.setTextColor(Color.parseColor("#525252"));
            }

            Glide.with(mContext).load(mpackid.optString("user_avatar_url"))
                    .asBitmap()
                    .thumbnail(Glide.with(mContext).load(R.drawable.ajax_loader).asBitmap())
                    .fitCenter()
                    .into(myHolder.user_image);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public long getItemId(int position) {
        return 0;// not using this
    }

    @Override
    public int getItemCount() {
        return mPages.length();
    }


    private static class ViewHolder{
        ImageView icon;
        TextView itemName;
        TextView url;
    }
    class MyHolder extends RecyclerView.ViewHolder{

        CircleImageView user_image;
        TextView user_name;
        TextView user_text;
        TextView feed_id;
        TextView number_likes;
        TextView like_int;
        TextView date;
        TextView tags;
        ImageButton button_like;

        // create constructor to get widget reference
        public MyHolder(View itemView) {
            super(itemView);
            user_image = (CircleImageView) itemView.findViewById(R.id.user_image);
            user_name = (TextView) itemView.findViewById(R.id.user_name);
            user_text = (TextView) itemView.findViewById(R.id.headline);
            number_likes = (TextView) itemView.findViewById(R.id.number_likes);
            feed_id = (TextView) itemView.findViewById(R.id._id);
            like_int = (TextView) itemView.findViewById(R.id.likes_nb);
            button_like = (ImageButton) itemView.findViewById(R.id.button5);
            date = (TextView) itemView.findViewById(R.id.date);
            tags = (TextView) itemView.findViewById(R.id.feed_tag);
        }

    }

    public JSONObject getItem(int position) {
        try {
            return mPages.getJSONObject(position);
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    }
    public void addMoreData(JSONArray loadMoreArray) throws JSONException {
        //Seta data pra LoadArray
        mPages.length();
        this.mPages = mPages.put(loadMoreArray.getJSONObject(0));
        notifyItemRangeInserted(mPages.length(), mPages.length()+1);
        SmoothRecyclerView recyclerView = (SmoothRecyclerView) ((Activity) this.mContext).findViewById(R.id.chat_social);
        recyclerView.scrollToPosition(mPages.length()-1);

    }
1个回答

0

你必须在onBindViewHolder中使用if else。

if(likes.contains(mUserId)){
            myHolder.button_like.setEnabled(false);
            myHolder.button_like.setBackground(mContext.getResources().getDrawable(R.drawable.filled_star));
            myHolder.number_likes.setText("foo "+mpackid.optJSONObject("info").optString("likes")+" foo");
            myHolder.number_likes.setTextColor(Color.parseColor("#525252"));
        }
 else{
     //behaviour when like.contains(userId) is false.
 }

这是因为视图持有者会在用户滚动时回收先前项目的视图,所以您必须对两种情况使用if else,以便视图持有者表现符合预期。

谢谢!我喜欢那样的东西,而且它工作得很好。 - Leonardo Cavazzani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接