arrayadapter.clear()删除基础数据

时间:2013-09-03 16:22:17

标签: android listview android-arrayadapter

我遇到了以下问题。我有一个listview和两个按钮。在片段的开头,一些数据存储在2个Arraylists中。首先,第一个Arraylist的内容显示在listview中,工作正常。当用户单击第一个按钮时,ListView会显示第二个ArrayList。这对用户来说很好,但只要我调用adapter.clear()。第一个Arraylist被删除了。因此,他无法通过单击第一个按钮切换回第一个列表。我从不删除Arraylist,所以我想知道为什么adapter.clear()会这样做。你能帮忙的话,我会很高兴。代码在下面。

public class MessagesFragment extends Fragment {

private ArrayList<Message> outbound;
private ArrayList<Message> inbound;
private MessageAdapter messageadapter;
private int box;
private View rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_messages, container,
            false);
    outbound = new ArrayList<Message>();
    inbound = new ArrayList<Message>();
    this.rootView = rootView;
    box = 0;
    messageadapter = new MessageAdapter(getActivity(),
                    R.layout.item_message, inbound);
    ((ListView) rootView.findViewById(R.id.lv_message))
                    .setAdapter(messageadapter);
    initializeListeners();
    return rootView;
}

private void initializeListeners() {
    rootView.findViewById(R.id.rb_message_inbox).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    showBox(0);
                }
            });

    rootView.findViewById(R.id.rb_message_outbox).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    showBox(1);
                }
            });     
}

private void showBox(int box) {
    messageadapter.clear();
    switch (box) {
    case 0:
        messageadapter.addAll(inbound);
        break;
    case 1:
        messageadapter.addAll(outbound);
        break;
    }
    this.box = box;
    messageadapter.notifyDataSetChanged();
}
}

因此,在开始时,列表将使用ArrayList入站填充。但是一旦调用了showbox(1),就会在调用messageadapter.clear()后立即删除。 将显示iutbound,但在入站之后调用showbox(0),因为它是空的。

1 个答案:

答案 0 :(得分:6)

这是因为您的类成员arraylist与您在适配器中设置的引用相同。通过

将数据添加到适配器
adapter.addAll(new ArrayList<Message>(inbound);
相关问题