刷新ArrayAdapter onResume [notifyDataSetChanged()不工作]

Roc*_*e28 9 android refresh fragment android-arrayadapter

我正在使用Fragments创建一个联系人列表应用程序,其中一个frag是联系人列表中的名称列表,另一个是剩余的详细信息.

这是显示名称列表的类

public class MyListFragment extends ListFragment {

private ContactStorage contactStorage = new ContactStorage();

public final static String TAG = "FRAGMENTS";
private MainActivity parent;
ArrayAdapter<String> adapter;

ArrayList<String> entries = new ArrayList<String>();

String array[];

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

    View v = inflater.inflate(R.layout.list_layout, null);
    parent = (MainActivity) getActivity();
    entries = contactStorage.getContactListNames();

    adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
            android.R.layout.simple_list_item_1, entries);

    setListAdapter(adapter);
    Log.d(TAG, "Adapter created");
    array = contactStorage.getContactDetails();
    return v;

}

@Override
public void onResume() {

    super.onResume();
    entries = contactStorage.getContactListNames();
    adapter.notifyDataSetChanged();
    Log.d(TAG, "List Frag Resumed");

}
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是ArrayAdapter在恢复时不刷新.

当屏幕旋转时,它再次运行onCreateView(),但是我需要它来刷新onResume.我查看了这个网站加载,发现什么,但"使用notifyDataSetChanged()",这是行不通的.

Elu*_*tar 29

您遇到的问题是您正在覆盖条目引用,并且它不会在适配器上进行更改.这是你如何解决这个问题

@Override
public void onResume() {

    super.onResume();
    entries.clear();
    entries.addAll(contactStorage.getContactListNames());
    adapter.notifyDataSetChanged();
    Log.d(TAG, "List Frag Resumed");

}
Run Code Online (Sandbox Code Playgroud)

这是一个常见的错误,这是因为当你第一次创建一个列表(在内存中)并且你的entries字段指向那个时,你会告诉adapter它在创建它时查看该内存位置,但是onResume你创建了一个新列表内存(当你再次获得联系人列表名称)并告诉条目指向内存中的新列表时,你需要做的是用新列表中的条目替换原始列表中的条目,这样adapter仍然会引用相同的列表.


Saz*_*han 5

notifyDataSetChanged()对您不起作用。原因

您的适配器失去对您的列表的引用。首次初始化适配器时,它会引用您的arrayList并传递给其超类。但是,如果您重新初始化现有的arrayList,它将丢失引用,因此将使用Adapter :(。

始终创建新列表并将其添加到适配器。这样做:

  1. 全局声明时初始化arrayList。
  2. 将列表直接添加到适配器,无需检查null和空条件。将适配器直接设置为列表(不检查任何条件)。适配器为您提供了保证,无论您在何处更改arrayList的数据,它都会注意,但绝不会丢失引用。
  3. 每次将数据添加到arrayList中(如果您的数据是全新的,则可以在实际将数据添加到列表之前先调用adapter.clear()和arrayList.clear()),但不要设置适配器,即如果新数据是不仅在adapter.notifyDataSetChanged()中填充到arrayList中

保持对文档的信任