我正在开发一个带有 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 多个小时,我不知道是什么导致了这个问题。
如果专家能指出我真的很感激。
谢谢你,丹尼斯