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

问题描述:

我正在使用Fragments创建联系人列表应用程序,其中一个frag是联系人列表中的名称列表,另一个是其余细节。刷新ArrayAdapter onResume [notifyDataSetChanged()不工作]

这里是显示名称的列表

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"); 

} 
} 

我遇到的问题是,一个ArrayAdapter不会在简历刷新类。

当屏幕旋转时,它的罚款作为onCreateView()再次运行,但我需要它刷新onResume。我已经看过这个网站的负载,但没有发现,但“使用notifyDataSetChanged()”不起作用。

+0

好了,你有什么期待?您正在检索“条目”,但不会重新构建您的“适配器”。将'entires ='和'adapter ='这两行从'onCreate()'移动到'onResume()'(你应该只做一次),'onResume()'忘记'entries ='和'notify''你会没事的。 – 2013-04-25 16:16:11

+0

@ClassStacker - 仍然是同样的问题。在屏幕旋转之前不刷新列表。 – RockJake28 2013-04-25 16:19:46

+0

嗯,是的,对不起,你还必须在那里做setListAdapter()。 – 2013-04-25 16:23:02

您遇到的问题是您覆盖了条目引用,并且它没有在适配器上发生变化。这里是你如何解决这个问题

@Override 
public void onResume() { 

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

} 

这是一个常见的错误之作,它造成的,因为当你第一次创建一个列表(在内存中)和你的entries场点,你再告诉adapter看在创建内存位置时,但您在内存中创建一个新列表(当您再次获取联系人列表名称时),并告诉条目指向内存中的新列表时,您需要做的是将内存中的条目替换包含新列表中条目的原始列表,那样adapter仍然会引用相同的列表。

+0

完美!我知道这与'.add()'有关,但我无法在这个话题上得到明确的答案。非常感谢你! – RockJake28 2013-04-25 16:24:23

+1

我也加了一个关于这个问题的更好的解释。另一种可以用你的ArrayAdapter实现的方法是恢复'adapter.clear();'然后'adapter.addAll(contactStorage.getContactListNames());'并且只是忘记所有的条目字段。 – Eluvatar 2013-04-25 16:25:56

+0

感谢队友,addAll做到了神奇;) – Salmaan 2015-04-10 20:14:53

notifyDataSetChanged()将不适用于您。原因为什么

您的适配器失去对您的列表的引用。当你第一次初始化Adapter时,它会引用你的arrayList并传递给它的父类。但是,如果你重新初始化现有的ArrayList它losts与适配器:(参考因此,通信信道

始终创建并添加一个新的列表适配器这样做:。

  1. 初始化ArrayList中而全球范围内宣布。
  2. 添加列表中直接向适配器进行检查空和空 状况。直接将适配器列表(不检查任何 条件)。适配器给你保证,无论你在哪里 改变数据的arrayList它会照顾,但不会松动 参考。
  3. 将数据添加到arrayList每次(如果您的数据是全新的 比您可以调用adapter.clear()和arrayList.clear()之前 实际将数据添加到列表中),但不要设置适配器即如果 新的数据填充ArrayList中不仅仅是 adapter.notifyDataSetChanged()

守信用,以之证件