0

我正在开发一个带有 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 5 正如预期的那样,

但是,当添加第 6 项,有时添加第 7 项时,它将看起来像这样 1 2 3 4 5 1 2 ...

下面是我的自定义 PostAdapter 函数:

公共类 PostAdapter 扩展 ArrayAdapter { int 资源;

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 多个小时,我不知道是什么导致了这个问题。

如果专家能指出我真的很感激。

谢谢你,丹尼斯

4

2 回答 2

0

问题是convertView不为null时的else部分,做else { postView = (RelativeLayout) convertView; 设置文本(内容字符串);}

于 2014-01-16T02:44:18.717 回答
0

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

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

contentView.setText(contentString);

于 2014-01-16T01:56:07.187 回答