0

我有一个列表视图和一个 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();
4

0 回答 0