我在下方列出了具有主图片和四张缩略图的项目,为了获取它们,我首先调用 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 个项目 :)
- 在 Parse 中,将
url
重命名为urlMain
并为四个缩略图创建列urlThumb1
、urlThumb2
,urlThumb3
和urlThumb4
数据类型为字符串。 - 将您的查询移到
onBindViewHolder()
方法之外,例如移动到您 Activity 的onCreate()
方法。 - 在 Parse 查询的
done()
回调中,将查询结果列表objects
传递给您的适配器,并在您的 RecyclerView 上设置适配器。 - 在
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/