在回收器视图中第二次滚动后,项目的值会有所不同



我列出了下面有一张主图片和四个拇指图像的项目,为了得到它们,我首先调用 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 查询。

您还可以简化正在使用的解析表。我假设您想要每个项目,1 个主图像和 4 个缩略图。因此,代表 1 个项目的每个ParseObject应包含主图像的 URL 和 4 个缩略图。不应为每个 URL 创建ParseObject。回收器中的 1 ParseObject = 1 项:)

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

代码如下所示:

  • 在您的活动和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);
                }
        }
    }
    

希望这有所帮助,如果这不是您想要的或有疑问,请在下面发表评论!

最新更新