【问题标题】:RecyclerView not updating items with positionRecyclerView 不更新具有位置的项目
【发布时间】:2017-01-17 04:11:07
【问题描述】:

我正在使用 JSON 从服务器将项目加载到 recyclerview 中,维护一个 Adapter 类以通过 hashmap 方法设置数据。我正在为 recyclerView 使用分页。每页包含 10 个项目,达到 10 个项目后页面递增。

问题是,加载后,当用户单击项目时,它没有刷新。

HomeClass 是一个启动器活动:

public class HomeClass  extends AppCompatActivity {

   protected void onCreate(Bundle savedInstanceState) {
      sendID(url);
    }

      public void sendID(final String url){
        if (progress == null) {
            progress = new ProgressDialog(this);
            progress.show();
        }
        Constant.Home_Posts.clear();
        new Thread(new Runnable(){
            @Override
            public void run() {
           ///pagecount is 1 in HomeClass by default
               JSONObject responseObj = new JSONObject(arg0);

          HashMap<String, String> map = new HashMap<String, String>();
                 map.put(key,value);
                Constant.Home_Posts.add(map);
                }
             }
                if (progress!=null) {
                  if (progress.isShowing()) {
                     progress.dismiss();
                     progress = null;
               Intent intent = new Intent(HomeClass.this, Home.class);
                     startActivity(intent);
                     finish();
                  }
        }

第二个类Home,只包含onBindViewHolder

       public class Home extends AppCompatActivity {
       protected void onCreate(Bundle savedInstanceState) {
       }

      private void getPostCount(final String URl) {
        if (progress == null) {
            progress = new ProgressDialog(this);
            progress.show();
        }
         new Thread(new Runnable() {
            @Override
            public void run() {

                viewposition = viewposition + 10;
                getPostUrl = "url+userid="+ userID+ "&page="+ page_count;

           //pagecount is 2 in 'Home' by default and then icrements
           JSONObject responseObj = new JSONObject(arg0);

               HashMap<String, String> map = new HashMap<String, String>();
                 map.put(key,value);
                Constant.Home_Posts.add(map);
                     '
                     '
                }
             }
            }
            page_count++;

适配器类:

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

  public void onBindViewHolder(RecyclerView.ViewHolder holder,final int i) {
            if (Constant.Home_Posts.size() - 1 == i) {
                Constant.Home_Posts.clear();
                getPostCount("url+ userID + "&page=" + page_count);
            }

         //set value using hashmap method from server
        viewHolder.imgComment.setText(value) //with integer values


       //OmCLick to update datas from user    
       viewHolder.imgComment.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                //get layout view by LayoutIflater and load data from server

                // create alert dialog
                final AlertDialog alertDialog = alertDialogBuilder.create();
               //user can comment anyhting,if success comment value in count 
               //should increment or comments should not change                 

                 sendComment.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {

                            if (commentStatus == 0) {
                            } else {
                              alertDialog.cancel();


           String putLikesValue=(Integer.toString(Integer.parseInt(
                Constant.Home_Posts.get(i).get("comments_count"))+1));

           viewHolder.txtComment.setText(putLikesValue+"Comments");

                 notifyDataSetChanged();
                     notifyItemChanged(i);
                 });
               }

结果是这样的, 旧项目与更新项目(新插入的项目)一起列出。

如何正确插入有位置的项目?

【问题讨论】:

  • 我没有得到你想要做的事情
  • 数据正在加载 10 个项目/页。如果我只在 API 中增加页面,我可以在 recyclerView 中加载剩余数据(如分页),这很好用。在 RecylerView 中加载项目后,当用户单击使用 EditText 获取布局以进行评论时。内容将更新到服务器,如果响应成功,我需要增加计数,否则关闭布局视图。问题是我尝试像插入一样更新计数,但计数作为新项目插入,即使我在执行 onScroll 时设置了位置,它也丢失了。

标签: android pagination android-recyclerview


【解决方案1】:

你好用这个来加载所有数据。

 public FriendsAdapterSwipe(List<FriendListModel> alFriendListModel,RecyclerView recyclerView,Context context)
 {
    this.alFriendListModel = alFriendListModel;
    this.context=context;

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {

        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                    }
                    loading = true;
                }
            }
        });
    }
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    RecyclerView.ViewHolder vh;
    if (viewType == VIEW_ITEM)
    {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.raw_friends_swipe, parent, false);
        vh = new CustomViewHolder(itemView);
    } else
    {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_item, parent, false);
        vh = new ProgressViewHolder(v);
    }
    return vh;
}

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

    if (holder instanceof CustomViewHolder)
    {
        Typeface AvenirNextRegular = Fonts.AvenirNextRegular(context);
        holder.setIsRecyclable(false);
        FriendListModel model = alFriendListModel.get(position);
        ((CustomViewHolder) holder).txtUname.setText(model.getFullName());
        ((CustomViewHolder) holder).txtUname.setTypeface(AvenirNextRegular);

        if (alFriendListModel.get(position).getIsImageAvaible().equalsIgnoreCase("1"))
        {
            Glide.clear(((CustomViewHolder) holder).imgProfile);
            Glide.with(context).load(WebField.PROFILE_URL + alFriendListModel.get(position).getFriendId()
                    + "_small.png").asBitmap()
                    .placeholder(R.drawable.user_pic).skipMemoryCache(true)
                    .diskCacheStrategy(DiskCacheStrategy.ALL).
                    fitCenter().into(new BitmapImageViewTarget(((CustomViewHolder) holder).imgProfile)
            {
                @Override
                protected void setResource(Bitmap resource)
                {
                    Drawable d = new BitmapDrawable(context.getResources(), resource);
                    ((CustomViewHolder) holder).imgProfile.setImageDrawable(d);
                }
            });
        }
    }
    else
    {
        ((CustomViewHolder) holder).imgProfile.setImageResource(R.drawable.user_pic);
    }
}

@Override
public int getItemCount() {
    return alFriendListModel.size();
}

@Override
public int getItemViewType(int position) {
    return alFriendListModel.get(position) != null ? VIEW_ITEM : VIEW_PROG;
}

public interface OnLoadMoreListener {
    void onLoadMore();
}

public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
    this.onLoadMoreListener = onLoadMoreListener;
}

public static class CustomViewHolder extends RecyclerView.ViewHolder
{
    TextView txtUname;
    CircularImageView imgProfile;;

    public CustomViewHolder(View itemView) {
        super(itemView);
        txtUname = (TextView) itemView.findViewById(R.id.txtUname);
        imgProfile = (CircularImageView) itemView.findViewById(R.id.imgProfile);
    }
}

public static class ProgressViewHolder extends RecyclerView.ViewHolder {
    public ProgressBar progressBar;

    public ProgressViewHolder(View v) {
        super(v);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
    }
}
public void setLoaded() {
    loading = false;
}

【讨论】:

  • 感谢发帖,这看起来像一个get,set方法,我已经尝试过了,它不会更新recyclerview中的项目。
  • 类型无关紧要,我有诸如用户可以发布图像/视频和其他用户可以评论之类的项目..我正在从服务器加载所有帖子..如果有任何用户 cmets 帖子,如果成功,它将连接到服务器,并且单独的评论项应该更新计数(+1)。
【解决方案2】:

您可以使用加载器根据页面设置数据。

 public EventAdapter(final List<EventsModel> myDataSet, RecyclerView recyclerView, Context context) {
    mDataset = myDataSet;
    this.context = context;

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {

        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);


                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    // End has been reached
                    // Do something
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                    }
                    loading = true;
                }
            }
        });
    }
}

@Override
public int getItemViewType(int position) {
    return mDataset.get(position) != null ? VIEW_ITEM : VIEW_PROG;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder vh;


    if (viewType == VIEW_ITEM) {


        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.raw_eventlist, parent, false);

        itemView.setOnClickListener(EventFragment.myOnClickListener);

        vh = new TextViewHolder(itemView);

    } else {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_item, parent, false);
        vh = new ProgressViewHolder(v);
    }
    return vh;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof TextViewHolder) {

        Typeface AvenirNextRegular = Fonts.AvenirNextRegular(context);
        ((TextViewHolder) holder).txtEventName.setTypeface(AvenirNextRegular);
        ((TextViewHolder) holder).txtEventDescription.setTypeface(AvenirNextRegular);
        ((TextViewHolder) holder).txtDate.setTypeface(AvenirNextRegular);
        ((TextViewHolder) holder).txtTime.setTypeface(AvenirNextRegular);

        ((TextViewHolder) holder).txtEventName.setText(mDataset.get(position).getStrEventName());
        ((TextViewHolder) holder).txtEventDescription.setText(mDataset.get(position).getStrDescription());
        ((TextViewHolder) holder).txtDate.setText(mDataset.get(position).getStrStartDate());
        ((TextViewHolder) holder).txtTime.setText(mDataset.get(position).getStrStartTime());


        final RecyclerView.ViewHolder tempHolder = holder;
        String eventId = mDataset.get(position).getStrEventId();


            if (mDataset.get(position).getIsImageAvailable().equalsIgnoreCase("1"))
            {
                Glide.clear(((TextViewHolder) holder).imgProfile);
                Glide.with(context).load(WebField.EVENT_URL + eventId + "_small.png").asBitmap()
                        .placeholder(R.drawable.event_img).skipMemoryCache(true).
                        diskCacheStrategy(DiskCacheStrategy.ALL).fitCenter()
                        .into(new BitmapImageViewTarget(((TextViewHolder) holder).imgProfile) {
                            @Override
                            protected void setResource(Bitmap resource) {

                                Drawable d = new BitmapDrawable(context.getResources(), resource);
                                ((TextViewHolder) tempHolder).imgProfile.setImageDrawable(d);
                            }

                        });
            }
            else
            {
                ((TextViewHolder) holder).imgProfile.setImageResource(R.drawable.event_img);
            }
    }
}

public void setLoaded() {
    loading = false;
}

@Override
public int getItemCount() {
    return mDataset.size();
}

public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
    this.onLoadMoreListener = onLoadMoreListener;
}

public interface OnLoadMoreListener {
    void onLoadMore();
}

public static class TextViewHolder extends RecyclerView.ViewHolder {

    CircularImageView imgProfile;
    TextView txtEventName;
    TextView txtEventDescription;
    TextView txtDate;
    TextView txtTime;
    ImageView btnNext;

    public TextViewHolder(View view) {
        super(view);
        this.imgProfile = (CircularImageView) view.findViewById(R.id.imgProfile);
        this.txtEventName = (TextView) view.findViewById(R.id.txtEventName);
        this.txtEventDescription = (TextView) view.findViewById(R.id.txtEventDescription);
        this.txtDate = (TextView) view.findViewById(R.id.txtDate);
        this.txtTime = (TextView) view.findViewById(R.id.txtTime);
        this.btnNext = (ImageView) view.findViewById(R.id.btnNext);
    }
}

public static class ProgressViewHolder extends RecyclerView.ViewHolder {
    public ProgressBar progressBar;

    public ProgressViewHolder(View v) {
        super(v);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
        progressBar.getIndeterminateDrawable().setColorFilter(Color.BLUE, PorterDuff.Mode.MULTIPLY);
    }
}

【讨论】:

  • 感谢您宝贵的时间,萨钦。我也尝试加载页面以更新评论项,但保留到滚动页面很困难..例如,第一页和第二页被保留,但第 3 页和之后的页面没有像上次那样加载。那就是我选择将评论框膨胀为布局视图..希望我现在解释了问题所在
  • 我没有得到我期望的答案。至少当我得到预期的答案时会接受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多