从 Parent 为 Fragment 的 ListView 设置适配器

Posted

技术标签:

【中文标题】从 Parent 为 Fragment 的 ListView 设置适配器【英文标题】:Set Adapter for Fragment's ListView from Parent 【发布时间】:2015-10-07 16:05:09 【问题描述】:

所以基本上一个 Fragment 通过 ViewPager 放置在一个 Activity 中,我试图通过从父 Activity 膨胀它来填充 Fragment 内部的 ListView。但是,项目不会被填充,也不会引发错误。

应从活动中填充数据

列表视图在片段中

这是我的代码:

活动

public class SearchActivity extends ActionBarActivity 

ListView peopleList;
ArrayList<String> data = new ArrayList<>();

@Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        //Inflate the Fragment to a new View Object
        LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View vii = inflator.inflate(R.layout.activity_search_people_tab, null);
        //Initialise the ListView with the Fragment's listview
        peopleList = (ListView) vii.findViewById(R.id.searchpeople_list);
        
        data.add("1");         
        data.add("2");     

        PopulateResults();


private void PopulateResults() 
        //populate the fragment's listview with the data generated by the parent activity
        SearchPeopleResultsAdapter adapter = new SearchPeopleResultsAdapter(SearchActivity.this,data);
        peopleList.setAdapter(adapter);

我只是想用父活动生成的值填充片段中的列表视图。伙计们,我该如何完成这项工作?

编辑:

所以基本上,活动有一个 EditText,下面我有一个带有两个片段的 ViewPager。第一个 Fragment 有一个 ListView。 'On Text changed' 我需要用数据填充 ListView。这是一个搜索功能:)

【问题讨论】:

为什么不能从 Fragment 内部初始化 ListView?据我了解,您应该从 ViewPager 适配器中检索 Fragment 实例。 @LeoFarage 用更多信息编辑了问题:) 【参考方案1】:

有很多方法可以实现 ListView 的初始化。

首先:在你的 Fragment onCreateView 中初始化它,因为 ListView 属于 Fragment,让它处理这个是有意义的。

第二:将您的数据添加到Bundle 并使用Fragment 中的setArguments() 方法将其添加到Fragment,然后在onCreate() 中检索Bundle 和您附加的数据.

第三:保存片段列表,将它们从getItem() 中保存到FragmentPagerAdapter 中。当您需要初始化/更新 ListView 适配器时,您可以检索 Fragment 并调用您创建的方法来初始化/更新 ListView。

希望这会有所帮助!

编辑:

假设您有一个 TextView 并在其 TextWatcher#afterTextChanged() 方法上执行以下操作:

// This adapter should be your custom adapter -- extending FragmentPagerAdapter
YourFragment fragment = (YourFragment) mViewPagerAdapter.getFragment(targetFragmentPostion);
fragment.addNewData(yourNewData);

YourFragment#addNewData(...) 方法中,你可以有类似的东西:

mListOfData.add(newData);
mListViewAdapter.notifyDataSetChanged();

我假设你在初始化你的 ListView 方面是成功的,所以这个编辑的内容是为了更新它的内容。

希望对你有所帮助。

【讨论】:

哦,也许.. 是否可以将数据从 Activity 动态发送到 Fragment?就像,只要在 EditText 中更改文本,数据就会传递给 Fragment。这样我就可以轻松地填充它。我怎样才能传递数据,伙计? 是的,当然。您只需检索 Fragment 实例并调用您的“setData”(您创建此方法)方法。确保将检索到的 Fragment 转换为您的 Fragment 类型(您从 Fragment 扩展的类)。【参考方案2】:

我不确定,在没有片段代码的情况下,您的实际实现是什么,但是您描述它的方式不起作用,因为您通过膨胀视图 xml 来膨胀片段的视图 onCreate() 的 Activity,但是实际的片段视图将在片段的onCreateView() 上呈现。

因此,在您的情况下,您必须通过 bundle 或任何其他方法将适配器数据从 Activity 传递到 Fragment,然后在 Fragment 的 onCreateView() 内填充您的视图。

简单来说,根据您当前的实现,两个视图是不同的,因此它不会影响或更新您的片段视图。实际的 Fragment 视图仅由 onCreateView() 方法创建(您在设备屏幕上看到的内容)。

【讨论】:

以上是关于从 Parent 为 Fragment 的 ListView 设置适配器的主要内容,如果未能解决你的问题,请参考以下文章

Fragment中获取Activity的方法进行fragment的切换

动态添加Fragment

fragment 与activity通信

嵌套Fragment的使用及遇到The specified child already has a parent. You must call removeView()问题的解决

Android Fragment之间传值

TabHost+ViewPager+Fragment实现页面的滑动,android开发工具deve