我有一个列表视图和一个 BaseAdapter。我使用添加一个元素到列表(它的数据集是一个数组列表)并调用 notifydatasetchanged()。它工作得很好。但是,如果我想更新一个已经添加的元素,我会从数据集中提取该元素并根据需要更新其内容,然后再次调用 notifydatasetChanged()。但现在它在列表中添加了与我更新的行相同的一行.. :( 任何帮助将不胜感激。谢谢。
更新:我有一个消息列表。当我发送消息时,我在列表中添加了一条消息,其进度条为 ON。在后台,一个线程运行,将消息发送到服务器。在线程返回时,我想从我作为消息添加到列表中的视图中隐藏该进度条。消息 pojo 有一个布尔属性,表示消息是否正在等待发送。并根据它在 getView() 中显示/隐藏进度条。
这是我的代码: 适配器:
public class MessagesAdapter extends BaseAdapter {
private ArrayList<Messages> messages=new ArrayList<Messages>();
private LayoutInflater inflater;
private Context mContext;
private static MessagesAdapter instance=null;
private boolean init=false;
public static MessagesAdapter getInstance() {
if(instance==null){
instance=new MessagesAdapter();
}
return instance;
}
public void init(Context context, ArrayList<Messages> arrayList) {
this.mContext=context;
this.messages=arrayList;
inflater=LayoutInflater.from(this.mContext);
init=true;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return messages.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return messages.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public void addMessage(Messages message){
this.messages.add(message);
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup list) {
View view;
Messages message=messages.get(position);
view=inflater.inflate(R.layout.message_outgoing, null);
ProgressBar pb=(ProgressBar) view.findViewById(R.id.send_progress);
if(message.messagePending){
pb.setVisibility(View.VISIBLE);
}
else{
pb.setVisibility(View.GONE);
}
TextView messageText=(TextView)view.findViewById(R.id.message_text);
messageText.setText(message.messageText);
return view;
}
public Messages getLastMessage(){
return messages.get(getCount()-1);
}
public String getFormattedTime(Timestamp timeStamp){
String timeText="";
Date date=new Date(timeStamp.getTime());
SimpleDateFormat displayFormat = new SimpleDateFormat(
"MM/dd/yyyy hh:mm a");
timeText=displayFormat.format(date);
return timeText;
}
public void removeLastMessage() {
messages.remove(messages.size()-1);
notifyDataSetChanged();
}
public boolean isInitialized(){
return init;
}
这是进行更改的活动代码:
adapter.getLastMessage().messagePending=false;
adapter.notifyDataSetChanged();