2

我遇到了以下问题。我有一个列表视图和两个按钮。在片段的开头,一些数据存储在 2 个数组列表中。首先,第一个 Arraylist 的内容显示在工作正常的列表视图中。当用户单击第一个按钮时,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) 不会因为它是空的。

4

1 回答 1

7

发生这种情况是因为您的类成员 arraylist 与您在适配器中设置的引用相同。通过以下方式将数据添加到适配器

adapter.addAll(new ArrayList<Message>(inbound);
于 2013-09-03T16:48:12.490 回答