我有一个活动,其中包含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,因为在调用它时片段不会显示。
答案 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及其适当的方法。
第二种方法可能是使用getView或getActivity(请检查与活动部分的沟通)。
例如:
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
创建singleton
类private
类,并创建一个getInstance
方法,该方法返回您的`MainActivity的唯一初始化实例。
这样可以确保您的数据实例不会被重新初始化或丢失。然后,在您的片段的onResume
中,将数据(从MainActivity
获取)重新设置为listview
adapter
,并从notifyDataSetChanged()
调用adapter
方法{1}}实例。
这样就可以了。