簡體   English   中英

將項目狀態保留在“回收者視圖”中

[英]Keep the state of item in Recycler View

我有一個從API填充數據的recyclerview。 每行都有一個喜歡的按鈕,用戶可以按此按鈕並更改圖標的顏色。

當用戶按下按鈕時,它工作正常,但是當他向上滾動頁面然后返回到喜歡的行時,類似的東西消失了,看起來好像從未被按下過。

如何保持這種“喜歡”狀態?

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);

    }

您必須在onBindViewHolder中使用if否則。

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.
 }

這是因為視圖持有者將在用戶滾動時回收上一個項目的視圖,因此對於兩種情況,您都必須使用其他方法,以便視圖持有者的行為符合預期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM