フラグメントベースのViewPagerをRecyclerViewアイテムとして割り当てました。 setText()
を使用してテキストを設定しながらRecyclerView.Adapter
フラグメントベースのViewPager(RecyclerViewアイテムとして)はヌルオブジェクトリファレンスを生成します
内部onBindViewHolder()
は
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
を生成します。値をバインドするときにビューが作成されないことを意味します。
ViewPager
とFragment
のインフレ率がonCreateViewHolder()
で処理されていても、なぜそのビューが作成されないのかわかりません。私はonBindViewHolder()
でもインフレを試みましたが、それでも同じです。
どうすればPage Fragment
をonBindViewHolder()
の前に強制的に押し込むことができますか?
RecyclerView.Adapter
public class MainListRVA extends RecyclerView.Adapter<ViewHolder> implements ConstantValues {
FragmentManager oFm;
private int viewPagerId = 1;
private static ArrayList<MainListItem> oListItems = new ArrayList<MainListItem>();
MainListRVA(ArrayList<MainListItem> theArray, FragmentManager fm){
oListItems = theArray;
oFm = fm;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_pager_main_list_item_folder, parent, false);
return new FolderVH(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
FolderVH folderVH = (FolderVH) holder;
MainListItem listItem = oListItems.get(position);
folderVH.fragmentOne.title.setText(listItem.oTitle);
folderVH.fragmentTwo.title.setText(listItem.oDetail);
/////////////////////////////////////////////////////
////////////////////THIS GIVE NULL POINTER EXCEPTION
}
public class FolderVH extends ViewHolder {
FolderMainPageFragment fragmentOne, fragmentTwo;
ViewPager viewPager;
FolderVH(View v) {
super(v);
ArrayList<Fragment> fragments = new ArrayList<Fragment>();
fragmentOne = FolderMainPageFragment.newInstance("one");
fragmentTwo = FolderMainPageFragment.newInstance("two");
fragments.add(fragmentOne);
fragments.add(fragmentTwo);
FolderVPAdapter folderVPAdapter = new FolderVPAdapter(oFm, fragments);
viewPager = (ViewPager) v.findViewById(R.id.viewPager);
viewPager.setId(viewPagerId++);
viewPager.setAdapter(folderVPAdapter);
}
}
@Override
public int getItemCount() {
return oListItems.size();
}
void move(int fromPos, int toPos){ }
void remove(int position){ }
}
FragmentPagerAdapter
public class FolderVPAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public FolderVPAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
ページャフラグメント
public class FolderMainPageFragment extends Fragment {
TextView title;
public static FolderMainPageFragment newInstance(String text) {
return new FolderMainPageFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main_list_item_view, container, false);
this.title = (TextView) v.findViewById(R.id.list_title);
return v;
}
}
を私はそれについて少し知っていたが、確認されませんでした。しかし、まだonBindViewHolder()の前にページフラグメントの膨張を強制する方法はありません。インフレ後にテキストを設定するその他の方法はありますか? – kanudo
もちろん、 'Bundle'を使って他の情報と一緒にタイトルを渡し、' getArguments() 'を呼び出すことで' FolderMainPageFragment.onCreate() 'で取り出すことができます。 – Abbas
あなたは正しいです。 @ Furedalもそれを示唆した。 **しかし**それはRecyclerViewの利点を妨げるでしょう。このアプローチと同様に、私は** onBindViewHolder()からViewPagerのFragmentsとPassの値を** Inflate **しなければなりません。私はそれを膨らませたくない。 – kanudo