如何在另一个片段中更新ListView?

时间:2014-03-04 18:35:58

标签: android listview android-listview android-fragments android-viewpager

我有一个活动,其中包含ViewPager个2片段。一个片段用于向ListView添加项目,另一个片段用于保存ListView

我已经尝试了近3天而没有任何积极的结果。如何从第一个片段更新其他片段的ListView

我正在尝试从保留ListView的活动中调用更新ViewPager的方法,但它不起作用。

ViewPager 活动

调用该方法
@Override
    public void onPageSelected(int position) {
    library.populateListView(getApplicationContext());
    aBar.setSelectedNavigationItem(position);
}

这是populateListView方法:

public void populateListView(Context context){      
    CustomListViewAdapter customAdapter = new CustomListViewAdapter(getDatabaseArrayList(context), getActivity());

        if (lView != null)
        {
            lView.setAdapter(customAdapter);
        }
        customAdapter.notifyDataSetChanged();
}

但是这不起作用,因为lView变量(ListView)为null,因为在调用它时片段不会显示。

3 个答案:

答案 0 :(得分:1)

了解碎片

请参阅此link。我已经详细解释了片段的概念。

特别注意rootview的定义:

public void onActivityCreared(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
            // Do stuff on creation. This is usually where you add the bulk of your code. Like clickListners
        // You can define this object as any element in any of your xml's 
        View rootview = inflater.inflate(R.layout.xml_the_fragment_uses container,false);
        rootview.findViewById(R.id.your_id).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Do something 
        }
    });
} 

在上面的例子中,我为on click侦听器定义了一个按钮,但你可以很容易地定义ListView及其适当的方法。

替代解决方案

第二种方法可能是使用getViewgetActivity(请检查与活动部分的沟通)。

例如:

ListView listView = (ListView) getView().findViewById(R.id.your_listView_id);

OR    (more likely solution for your problem)

View listView = getActivity().findViewById(R.id.list);

请阅读this帖子了解更多信息。

祝你好运。

答案 1 :(得分:1)

我假设函数populateListView()是包含ListView的Fragment的函数。您在每次拨打populateListView()时都在呼叫onPageSelected。你不应该检查被选中的位置。无论如何,populateListView()方法应该是包含ListView的片段的公共方法。并且您可以从Activity中的Viewpager适配器实例化片段,而不是调用此方法。这样listView不应该为空。

@Override
public void onPageSelected(int position) {
ListViewFragment frag=(ListViewFragment)adapter.instantiateItem(viewPager, 1);
//here adapter is the ViewPager Adapter and you must supply the viewpager that    contains 
//the fragments and also the position of the fragment to instantiate. 
//For example 0 or 1 etc.
frag.populateListView(getApplicationContext());
aBar.setSelectedNavigationItem(position);
}

答案 2 :(得分:0)

要安全地执行此操作,您必须将listview数据保持在更高级Parent-Activity而不是fragments。通过构造函数MainActivity创建singletonprivate类,并创建一个getInstance方法,该方法返回您的`MainActivity的唯一初始化实例。

这样可以确保您的数据实例不会被重新初始化或丢失。然后,在您的片段的onResume中,将数据(从MainActivity获取)重新设置为listview adapter,并从notifyDataSetChanged()调用adapter方法{1}}实例。

这样就可以了。