我在使用FragmentPagerAdapter时遇到问题。我想从视图寻呼机中的片段中检索数据。当我调用getItem()方法时,它返回一个片段,但不创建片段。所有片段变量均为null。我需要做什么来实例化片段?这是我的适配器。
public class SubItemAdapter extends FragmentPagerAdapter implements Serializable {
List<Item> itemList = new ArrayList<>();
int layout;
public SubItemAdapter(FragmentManager mgr, List<? extends Item> items, int layout) {
super(mgr);
itemList.addAll(items);
this.layout = layout;
}
@Override
public int getCount() {
return itemList.size();
}
@Override
public SubItemFragment getItem(int position) {
return SubItemFragment.newInstance(itemList.get(position), layout);
}
}
这是viewpager中的片段。
public class SubItemFragment extends Fragment {
Item item;
View view;
Context mContext;
private static final int RC_BARCODE_CAPTURE = 9001;
private static final String ITEM_KEY = "item";
private static final String LAYOUT_PAGER_KEY = "layout";
public static SubItemFragment newInstance(Item item, int layout) {
SubItemFragment frag = new SubItemFragment();
Bundle args = new Bundle();
args.putSerializable(ITEM_KEY, item);
args.putInt(LAYOUT_PAGER_KEY, layout);
frag.setArguments(args);
return (frag);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
int layout = getArguments().getInt(LAYOUT_PAGER_KEY);
view = inflater.inflate(layout, container, false);
item = (Item) getArguments().getSerializable(ITEM_KEY);
mContext = getContext();
/* Populate the fragment with data
. . .
*/
return (view);
}
public Item getItem() {
item.retrieve_data_and_populate_item();
return item;
}
}
我不太了解ViewPager是如何工作的,但据我所知,片段在没有设置任何变量的情况下返回的原因是因为ViewPager没有附加片段。如何让getItem(int位置)函数返回初始化片段?如果我的问题不够清楚,或者您需要查看更多代码,请告诉我。提前感谢。
编辑
我正在父片段中设置适配器。以下是添加ViewPager的代码:
public class General_Fragment implements SubItemFragment.subItemListener {
private static final int LAYOUT_PAGER_KEY = R.layout.sub_form_meter_read;
private SubItemAdapter mAdapter;
private WrapViewPager mPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.workorder_detail, container, false);
meters = getMeterList();
mPager = rootView.findViewById(R.id.meter_list);
mPager.addOnPageChangeListener(getOnPageListener());
mAdapter = buildAdapter(meters);
mPager.setAdapter(mAdapter);
return rootView;
}
/*. . .*/
private SubItemAdapter buildAdapter(List<? extends Item> items) {
return new SubItemAdapter(getChildFragmentManager(), //Fragment View
items, //Item to get data from
LAYOUT_PAGER_KEY
);
}
}
我不认为我的问题在于初始化适配器,因为它确实显示,但当我从片段中检索数据时,它会因为空片段而崩溃
我发现了一个类似的问题,解释了我所看到的是错误的。这是引导我找到解决方案的答案。
https://stackoverflow.com/a/14039416/9301369
基本上正如他所说,getItem()并不像我想的那样检索已经生成的片段。它实际上是用来创建新片段的。这就是为什么我得到的片段不会返回null,但也不会被实例化。我所做的是添加了片段管理器(FragmentManager) 编码到适配器变量,并在构造函数中设置它
public SubItemAdapter(FragmentManager mgr, List<? extends Item> items, int layout) {
super(mgr);
this.mgr = mgr;
itemList.addAll(items);
this.layout = layout;
}
然后搜索片段管理器以获得我需要的特定片段。传入位置和寻呼机ID,mPager.getID
。
public SubItemFragment getSubItemFragment(int viewPagerId, int fragmentPosition) {
return (SubItemFragment) mgr.findFragmentByTag("android:switcher:" + viewPagerId + ":" + fragmentPosition);
}
所以基本上,我认为ViewPager没有附加片段的假设是错误的。片段是附加的,我只是引用新创建的片段。
我使用带有ViewPager的FragmentPagerAdapter来切换片段 那么我如何使片段调用它们的onResume()呢?
我在过去的两个小时里一直在试图解决这个问题。试过很多东西。 该片段似乎正在向我的适配器传递空上下文。我尝试在onCreate和onCreateView和onActivityCreated中初始化上下文变量。同样的结果。
我有一个由片段填充的ViewPager。特别是,我有一个片段,它显示了Addresses对象的列表和一个允许创建新地址的列表。添加新地址的过程如下: 因此,当添加新地址时,我回到AddressListFragment,它是ViewPager中的活动地址。我需要更新该片段,以便更新列表与新添加的地址时,我回来它!我需要在那个片段上重写一个特定的方法吗? 提前道谢!
当我实例化实体并在DTO to entity方法上使用mapstruct mapper时,我有一个返回空指针的简单映射器。我的实体要长得多,并且使用另一种语言,所以我将编写一个类似的实体作为示例。 我使用的是java 8和Spring boot 2.5.2 这是我的实体: 这是我的数据传输对象,又名DTO: 这是我的映射器,两个类(实体和dto)具有相同的属性名称。事实上,我也尝试过@Map注释,
我正在为我的单选按钮使用ItemListener。我看到了很多ItemListener函数,但我的似乎工作方式不同。 它返回的值是“javax.swing.JRadioButton[User,445453,49x18,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth”。SynthBorder@1f2f60d,flags=288,
最后,这里是Fragment类