Android 毕加索+;在错误视图中循环查看插入图像

Android 毕加索+;在错误视图中循环查看插入图像,android,listview,picasso,mixed,Android,Listview,Picasso,Mixed,我有一个简单的适配器 public class ConversationListAdapter extends RecyclerView.Adapter<Conversation.ViewHolder> { private List<Conversation> items; private Activity activity;

我有一个简单的适配器

  public class ConversationListAdapter extends 

            RecyclerView.Adapter<Conversation.ViewHolder> {

                        private List<Conversation> items;
                        private Activity activity;
                        public ConversationListAdapter(Activity activity, List<Conversation>   items) {
                            super();
                            this. items = items;
                            this.activity = activity;
                        }

                        @Override
                        public void onBindViewHolder(ViewHolder viewHolder, int i) {
                            Conversation conversation = mItems.get(i);
                            viewHolder.name.setText(conversation.getName());
                             if ( conversation.getUrl() != null) {                 

         Picasso.with(activity.getApplicationContext()).load(conversation.getUrl())
                                        .into(viewHolder.imageView);
                                 }

                        }

                        and a basic 
                       class ViewHolder extends RecyclerView.ViewHolder  implements       View.OnClickListener {..}
                          }
现在我调用我的RESTAPI来获取数据,当它第一次工作时,一切都正常了(假设在c中只有2项,顺序是conv1和conv2)

private void handleResult(列表c){
项目.清除()
项目.添加所有(c)
adapter.notifyDataSetChanged()
}
但是。。。现在,如果我刷新,列表中的数据以不同的顺序(conv2和conv1)出现在适配器之后。notifyDataSetChanged()列表中的两个imageView都有相同的图片!但是textView有正确的文本

这只发生在满是毕加索作品的场景中,无法理解为什么


有人能帮我吗?

您必须更换适配器中的项目,或者用新项目创建一个新适配器

第一个解决方案:

private void handleResult(List<Conversation> c) {
 mRecyclerView.setAdapter(new ConversationAdapter(getActivity(), c));
}
private void handleResult(List<Conversation> c) {
 adapter.setList(c);
 adapter.notifyDataSetChanged();
}
private void handleResult(列表c){
setAdapter(新的会话适配器(getActivity(),c));
}
第二种解决方案:

private void handleResult(List<Conversation> c) {
 mRecyclerView.setAdapter(new ConversationAdapter(getActivity(), c));
}
private void handleResult(List<Conversation> c) {
 adapter.setList(c);
 adapter.notifyDataSetChanged();
}
private void handleResult(列表c){
adapter.setList(c);
adapter.notifyDataSetChanged();
}

不要忘记在
适配器中创建
setList(List c)
方法

您必须替换适配器中的项目或使用新项目创建新适配器

第一个解决方案:

private void handleResult(List<Conversation> c) {
 mRecyclerView.setAdapter(new ConversationAdapter(getActivity(), c));
}
private void handleResult(List<Conversation> c) {
 adapter.setList(c);
 adapter.notifyDataSetChanged();
}
private void handleResult(列表c){
setAdapter(新的会话适配器(getActivity(),c));
}
第二种解决方案:

private void handleResult(List<Conversation> c) {
 mRecyclerView.setAdapter(new ConversationAdapter(getActivity(), c));
}
private void handleResult(List<Conversation> c) {
 adapter.setList(c);
 adapter.notifyDataSetChanged();
}
private void handleResult(列表c){
adapter.setList(c);
adapter.notifyDataSetChanged();
}

不要忘记在
适配器中创建
setList(List c)
方法

如果您在任何适配器中使用if条件,您还必须设置它的其他部分。我也不知道为什么会发生这种情况,若条件被给定,那个么对孩子来说,条件是相同的,但不匹配,这可能是android中的一个bug。请尝试它的其他部分。这可能对您有用。

在任何适配器中使用if条件时,您还必须设置它的其他部分。我也不知道为什么会发生这种情况,若条件被给定,那个么对孩子来说,条件是相同的,但不匹配,这可能是android中的一个bug。请尝试它的其他部分。这可能对您有用。

我刚刚尝试过,如果我删除了空复选框(我之所以这样做是因为毕加索放了一张空白图像),而是使用了.error(..).placeHolder(..),表明错误行为不会发生。您定义了空的ConversationListAdapter.ViewHolder,但您的适配器类是为Conversation.ViewHolder键入的。里面有什么?你在onCreateViewHolder中做了什么?普通的东西,findById等等。我刚刚尝试过,如果我删除了空检查(我之所以这样做是因为毕加索放了一张空白图像),而是使用了。错误(..)。占位符(..),错误行为不会发生。你定义了空的ConversationListAdapter.ViewHolder,但您的适配器类键入的是对话.ViewHolder。里面有什么?你在onCreateViewHolder中制作了什么?普通的东西,findById等等。我可以尝试,但我认为你可能是对的,如果我使用了if,我需要设置一个else,否则viewImage将保持刷新前的状态(即使我使用notifiyDataSetChanged时项目为空)是的,您得到了正确的文本,因为文本没有条件,所以它对每个孩子都有更改,但在imageview中,您为少数孩子提供了条件,所以孩子得到了旧的一个引用,并设置了错误的图像或将其删除。我可以尝试,但我认为您可能是正确的,如果使用if,则需要设置else,否则viewImage将保持刷新前的状态(即使使用notifiyDataSetChanged时项目为空)是的,您得到了正确的文本,因为文本没有条件,所以它对每个孩子都有更改,但在imageview中,您为少数孩子提供了条件,所以孩子得到了旧的一个引用,并设置了错误的图像或将其删除。是的,解决方案1是我的临时解决方法,但不确定每次重新设置适配器是否是一种好的做法。我没有尝试解决方案2,但事实是我做了items.clear(这是我在构造函数中传递的相同项)这不会与解决方案2有相同的效果吗?我总是使用第二个解决方案,但在您的情况下,如果您想使用相同的
items
变量,则必须在
items.addAll(c)之后添加
adapter.setList(items)
因为适配器保留了自己的旧ìtems`变量。如果答案有用,请不要忘记接受它,因为它可能会帮助其他人:)是的,解决方案1是我的临时解决方案,但不确定每次重新设置适配器是否是一种好的做法。我没有尝试解决方案2,但事实是我做了items.clear(这是我在构造函数中传递的相同项)这不会与解决方案2有相同的效果吗?我总是使用第二个解决方案,但在您的情况下,如果您想使用相同的
items
变量,则必须在
items.addAll(c)之后添加
adapter.setList(items)
因为适配器保留了自己的旧ìtems`变量。如果答案有用,不要忘记接受它,因为它可能会帮助他人:)