调用notifyDataSetChanged时,ArrayAdapter搞砸了ListView的内容

时间:2014-01-16 01:44:42

标签: android android-arrayadapter listadapter notifydatasetchanged

我正在开发一个带有ListView / ArrayAdapter组合的Android应用程序,当它从另一个服务接收广播时动态添加这些项目。

以下是初始设置:

postAdapter = new PostAdapter(this.getActivity(), R.layout.item, posts);

ListView list = (ListView) V.findViewById(R.id.listView1);

list.setAdapter(postAdapter);       

最初列表中有一些元素(存储在帖子中)。

适配器中listView的初始渲染效果非常好。

但是,当收到来自其他服务问题的广播时。

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        String title= intent.getStringExtra("title");
        String content= intent.getStringExtra("content");
        String senderDesc= intent.getStringExtra("senderDesc");
        String receiverDesc= intent.getStringExtra("receiverDesc");

        Post newPost = new Post(title, content, senderDesc, receiverDesc);

        posts.add(newPost);

        postAdapter.notifyDataSetChanged();

    }
};  

首先,当添加前2个元素时,listView看起来仍然很好。

在将listView添加到大约7个元素之前,下一个元素不再呈现为所讨论元素的内容,而是前一个元素的内容。

例如(伪以简化):

以下是初始列表: 1 2 3

当添加第4个和第5个帖子时,listView看起来像: 1 2 3 4 五 正如所料,

但是,当添加第6个项目甚至第7个项目时,它将如下所示 1 2 3 4 五 1 2 ...

以下是我的自定义PostAdapter功能:

public class PostAdapter extends ArrayAdapter {     int resource;

public PostAdapter(Context context, int resource, List<Post> posts) {
    super(context, resource, posts);
    this.resource = resource;
}

@Override
public View getView(int position,  View convertView, ViewGroup parent) {

    // Setting up postView
    RelativeLayout postView;

    Post post = getItem(position);

    String titleString = post.getTitle();
    String contentString = post.getContent();
    String senderDescString = post.getSenderDesc();
    String receiverDescString = post.getReceiverDesc(); 

    if(convertView == null) {

        postView = new RelativeLayout(getContext());
        String inflater = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater li;

        li = (LayoutInflater)getContext().getSystemService(inflater);
        li.inflate(resource, postView, true);

        TextView contentView = (TextView) postView.findViewById(R.id.postContent);

        contentView.setText(contentString);

    } else {
        postView = (RelativeLayout) convertView;
    }

    // Check if the post has been previously populated;


    return postView;
}

}

我花了超过10个小时,我不知道是什么导致了这个问题。

如果专家可以向我指出,我真的很感激。

谢谢你, 丹尼斯

2 个答案:

答案 0 :(得分:0)

我认为View-reused使这种情况发生,把下面的方法放在getView()方法注释下面,它会起作用。顺便说一下,如果要显示很多项目,你应该在AdapterView中使用ViewHolder模式

  

TextView contentView =(TextView)postView.findViewById(R.id.postContent);

     

contentView.setText(contentString);

答案 1 :(得分:0)

当convertView不为null时,问题是else部分 其他{         postView =(RelativeLayout)convertView; 的setText(contentString);     }