按钮触发后刷新ListView项目

时间:2014-11-15 12:40:07

标签: java android listview

在触发按钮后尝试刷新列表视图中的项目时遇到了一些问题。以下是我如何填充listview onCreate:

public class EventChat extends Fragment {
Context context;
View eventChat;

String userID, eventID;

private ListView listview;
public ArrayList<EventComment> _commentlist = new ArrayList<EventComment>();
TextView txtDisplayCommentBy, txtDisplayDateTime, txtDisplayCommentDesc,
        txtEventChat;

Button btnChatSubmit;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    eventChat = inflater.inflate(R.layout.event_chat, container, false);
    context = getActivity();

    listview = (ListView) eventChat.findViewById(R.id.listview);
    txtEventChat = (TextView) eventChat.findViewById(R.id.txtEventChat);

    btnChatSubmit = (Button) eventChat.findViewById(R.id.btnChatSubmit);
    btnChatSubmit.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            onSubmitChatClicked();
        }
    });

    Intent i = getActivity().getIntent();
    _commentlist = (ArrayList<EventComment>) i
            .getSerializableExtra("eventCommentObj");
    Event eventModel = (Event) i.getSerializableExtra("eventObj");

    userID = "Gab";
    eventID = eventModel.getEventID();

    listview.setAdapter(new ListAdapter(getActivity()));

    return eventChat;
}

private class ListAdapter extends BaseAdapter {
    LayoutInflater inflater;
    ViewHolder viewHolder;

    public ListAdapter(Context context) {
        inflater = LayoutInflater.from(context);
    }

    public int getCount() {
        return _commentlist.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {

            convertView = inflater.inflate(R.layout.eventchat_listview_row,
                    null);
            viewHolder = new ViewHolder();
            viewHolder.txt_dcommentBy = (TextView) convertView
                    .findViewById(R.id.txtDisplayCommentBy);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.txt_dcommentBy.setText(_commentlist.get(position)
                .getCommentBy().trim());
        return convertView;
    }
}

private class ViewHolder {
    TextView txt_dcommentBy;
    TextView txt_ddateTime;
    TextView txt_dcommentDesc;
}
}

当触发我的按钮并将新记录插入数据库时​​,我希望刷新列表视图项目:

public void onSubmitChatClicked() {
    EventComment commentModel = new EventComment();
    String currentDate = EventDateTime.getCurrentDate();
    String currentTime = EventDateTime.getCurrentTime();
    String commentDesc = String.valueOf(txtEventChat.getText());
    commentModel.setCommentBy(userID);
    commentModel.setEventID(eventID);
    commentModel.setCommentDate(currentDate);
    commentModel.setCommentTime(currentTime);
    commentModel.setCommentDesc(commentDesc);
    new CreateCommentAsyncTask(context).execute(commentModel);

    txtEventChat.setText("");

}

然而,它没有刷新。有什么想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

你无法listview.setAdapter(new ListAdapter(getActivity()));来实现这一目标。您应该创建adapter的实例并致电adapter.add + adapter.notifyDataSetChanged

这是一个非常好的教程:

http://www.vogella.com/tutorials/AndroidListView/article.html http://www.javacodegeeks.com/2013/09/android-listview-with-adapter-example.html

答案 1 :(得分:0)

这看起来非常简单。

首先使您的适配器成为类成员,以便稍后访问它:

private ListAdapter mAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ...
    mAdapter = new ListAdapter(getActivity();
    listview.setAdapter(mAdapter);
    ...
}

然后,当您提交项目时,还要将其添加到您的ArrayList并更新您的适配器:

public void onSubmitChatClicked() {
    EventComment commentModel = new EventComment();
    String currentDate = EventDateTime.getCurrentDate();
    String currentTime = EventDateTime.getCurrentTime();
    String commentDesc = String.valueOf(txtEventChat.getText());
    commentModel.setCommentBy(userID);
    commentModel.setEventID(eventID);
    commentModel.setCommentDate(currentDate);
    commentModel.setCommentTime(currentTime);
    commentModel.setCommentDesc(commentDesc);

    // Add the new element to your DB
    new CreateCommentAsyncTask(context).execute(commentModel);
    // Add the new element to your current ArrayList
    _commentlist.add(commentModel)
    // Update theListView, by updating the adapter
    mAdapter.notifyDataSetChanged();

    txtEventChat.setText("");
}

编辑:

更多解释:

创建片段后,您将传递一组EventComment个项目。我猜这些是你的数据库中的元素。但是,更新数据库时,除非重新加载整个片段,否则不会更新ArrayList。这就是为什么你将项目添加到数据库,手动添加到列表,并使用notifyDataSetChanged,强制你的适配器更新ListView。