在我的应用程序中,我想将一个搜索查询从edittext传递到我的适配器,该适配器位于其中一个子片段中。在childfragment中,我想根据我在edittext中输入的文本过滤适配器,该文本位于父片段中。
首先,我尝试从viewpageradapter获取一个片段,然后调用适配器的全局变量(这是公共的),这会在适配器上产生一个空指针。
Edittext searchFilter = new Edittext(getActivity())
final FragmentShows fragment = (FragmentShows) adapter.getItem(1);
searchFilter.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if(fragment != null) {
--> NULL POINTER fragment.adapter.getFilter().filter(charSequence.toString());
}}
@Override
public void afterTextChanged(Editable editable) {}
});
接下来我尝试(不要真正理解接口)来创建一个接口并让子片段实现这个接口:
父片段
private Fragmentfilter filter
...
Edittext searchFilter = new Edittext(getActivity())
final FragmentShows fragment = (FragmentShows) adapter.getItem(1);
searchFilter.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
--> NULL POINTER HERE filter.OnTextChangedListener(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {}
});
Childfragment:
public class FragmentShows extends Fragment implements FragmentFilter{
...
@Override
public void OnTextChangedListener(String searchQuery) {
adapter.getFilter().filter(searchQuery);
}
}
接口:
public interface FragmentFilter {
void OnTextChangedListener(String searchQuery);
}
有人可以解释为什么它不起作用,也许可以帮助我/推动我如何解决这个问题。
我不必仅在输入的查询上过滤适配器的结果。
答案 0 :(得分:3)
未分配变量filter
的值,这就是发生NullPointerException的原因。因此,您需要根据您的附加方式保留对子片段的引用。有两个选项:
1)如果您将子片段直接附加到片段布局(xml上带有fragment
标记),则需要恢复该实例并以这种方式分配:
FragmentManager fm = getActivity().getFragmentManager();
Fragment childFragment = fm.findFragmentById(R.id.child_fragment);
filter = (FilterFragment) childFragment;
其中R.id.child_fragment
是您在XML上设置为片段的ID,XML可能如下所示:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
class="com.path.to.your.fragment.ChildFragment"
android:id="@+id/child_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
2)第二种情况是,如果您使用添加或替换等事务附加子片段,那么您只需要保留对子片段实例的引用并将其分配给{{ 1}}变量。它可能看起来像这样:
filter
R.id.fragment_container,是您尝试附加子片段的视图组。您的布局XML可能如下所示:
Fragment childFragment = new ChildFragment();
FragmentManager fm = getActivity().getFragmentManager();
fm.beginTransaction().replace(R.id.fragment_container, childFragment).commit();
filter = (FilterFragment) childFragment;