从 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的使用及遇到The specified child already has a parent. You must call removeView()问题的解决