android - 在 RecyclerView 中第二次滚动后项目的值不同

标签 android scroll android-recyclerview

我在下方列出了具有主图片和四张缩略图的项目,为了获取它们,我首先调用 parsequery,然后将它们与 url 一起显示。当我第一次滚动时,一切看起来都不错,但在第一次滚动后,如果我在任何项目中只有两个缩略图,则连续的缩略图 3 和 4 将显示第一个项目的缩略图。这是代码,我稍微简化了一下

    public void onBindViewHolder(final VersionViewHolder versionViewHolder, final int i) {

      final Post itPost = items.get(i);

      versionViewHolder.itemView.setTag(itPost);

      ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
      query.whereEqualTo("postid", itPost.getIdPost());
      query.orderByDescending("createdAt");
      query.findInBackground(new FindCallback<ParseObject> () {
        @Override
        public void done(final List<ParseObject> objects, ParseException e) {
          if(e == null) {

            for(int o = 0; o < objects.size(); o++) {

              if(o == 0) {
                ImageUtil.displayImage(versionViewHolder.mainImg, objects.get(o).getString("url"), null);
              } else if(o == 1) {
                ImageUtil.displayImage(versionViewHolder.imgThumb, objects.get(o).getString("url"), null);
              } else if(o == 2) {
                ImageUtil.displayImage(versionViewHolder.imgThumb2, objects.get(o).getString("url"), null);
              } else if(o == 3) {
                ImageUtil.displayImage(versionViewHolder.imgThumb3, objects.get(o).getString("url"), null);
              } else if(o == 4) {

                ImageUtil.displayImage(versionViewHolder.imgThumb4, objects.get(o).getString("url"), null);

                versionViewHolder.imgThumb4.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                    //alertGallery(,versionViewHolder.itemView);
                  }

                });
              } else if(o <= 5) {

                String num = "" + o;
                versionViewHolder.txtContadorImagenes.setText("+ ");

                //TODO 
              }

            }

          }

        }
      });

最佳答案

问题来自于每次调用 onBindViewHolder() 方法并使用 for 循环时运行 Parse 查询。

您还可以简化正在使用的 Parse 表。我假设您想要每个项目、1 个主图像和 4 个缩略图。因此,代表 1 个项目的每个 ParseObject 都应该包含主图像和 4 个缩略图的 url。你不应该为每个 url 创建一个 ParseObject。 1 ParseObject = RecyclerView 中的 1 个项目 :)

  1. 在 Parse 中,将 url 重命名为 urlMain 并为四个缩略图创建列 urlThumb1urlThumb2urlThumb3urlThumb4 数据类型为字符串。
  2. 将您的查询移到 onBindViewHolder() 方法之外,例如移动到您 Activity 的 onCreate() 方法。
  3. 在 Parse 查询的 done() 回调中,将查询结果列表 objects 传递给您的适配器,并在您的 RecyclerView 上设置适配器。
  4. onBindViewHolder() 中删除 for 循环并根据所选的 ParseObject 使用 displayImage,该对象由(适配器数据集中的项目)的位置决定。

代码看起来像:

  • 在您的 Activity 和 onCreate() 中:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // execute the parseQuery
            ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
            query.whereEqualTo("postid", itPost.getIdPost());
            query.orderByDescending("createdAt");
            query.findInBackground(new FindCallback<ParseObject> () {
                @Override
                public void done(final List<ParseObject> objects, ParseException e) {
                    if(e == null) {
                        // if no ParseException, pass the objects list to the adapter
                        YourAdapter yourAdapter = new YourAdapter(objects);
                        // set the adapter
                        yourRecyclerView.setAdapter(yourAdapter);
                    }
                }
            }
    
        ...
    
        }
    }
    
  • 在你的适配器中

    public class YourAdapter extends RecyclerView.Adapter<YourViewHolder> {
        private List<ParseObject> list;
    
        public YourAdapter(List<ParseObject> objects) {
            list = objects;
        }
    
        ...
    
        // in the onBindViewHolder method, set the image based on the position
        @Override
        public void onBindViewHolder(YourViewHolder holder, int position) {
            ParseObject currentObj = list.get(position);
    
            ImageUtil.displayImage(holder.mainImg, currentObj.getString("urlMain"), null);
            ImageUtil.displayImage(holder.imgThumb, currentObj.getString("urlThumb1"), null);
            ImageUtil.displayImage(holder.imgThumb2, currentObj.getString("urlThumb2"), null);
            ImageUtil.displayImage(holder.imgThumb3, currentObj.getString("urlThumb3"), null);
            ImageUtil.displayImage(holder.imgThumb4, currentObj.getString("urlThumb4"), null);
    
            holder.imgThumb4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //alertGallery(,versionViewHolder.itemView);
                }
        }
    }
    

希望这对您有所帮助,如果这不是您想要的或有任何疑问,请在下方评论!

关于android - 在 RecyclerView 中第二次滚动后项目的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066710/

相关文章:

android - 在 Jetpack Compose 中确定键盘是否存在并相应更改布局

android - RecyclerView StaggeredGridLayoutManager 重新排序问题

java - 无法访问 fragment 中的构造函数 public CameraPreview(Contextfragment,Cameracamera,PreviewCallbackpreviewCb,AutoFocusCallbackautoFocusCb)

android - Android 手机上的 SSL 错误/警告,但桌面浏览器上没有

java - 如何从 ArrayList 在 ListView 上显示员工详细信息?

ios - (XCODE) TextView : shows bottom of text as first

javascript - 单击表单上的下一个按钮后禁用 Scrolltop - js

java - 为什么我会收到错误 "package org.mockito.runners does not exist"?

android - RecyclerView LinearLayoutManager computeVerticalScrollOffset() 没有返回正确的值

android - v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge()