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