Android 如何从web服务将ViewPager中的片段添加到TableLayout?
我正在尝试将选项卡动态添加到基于Android 如何从web服务将ViewPager中的片段添加到TableLayout?,android,android-fragments,android-viewpager,android-tablayout,Android,Android Fragments,Android Viewpager,Android Tablayout,我正在尝试将选项卡动态添加到基于TabLayout ViewPager片段的应用程序中。TabLayout使用一个自定义视图,其中ImageView位于TextView之上 我现在想要的是根据从PHP/MySQL web服务创建的JSONArray中JSONObjects的数量添加选项卡。我在我的PagerAdapter中尝试了以下方法,但它抛出: java.lang.IllegalStateException:无法更改片段TstFrag{df80bc8#0 id=0x7f080157的标记an
TabLayout ViewPager片段的应用程序中。TabLayout
使用一个自定义视图,其中ImageView
位于TextView
之上
我现在想要的是根据从PHP/MySQL web服务创建的JSONArray
中JSONObjects
的数量添加选项卡。我在我的PagerAdapter
中尝试了以下方法,但它抛出:
java.lang.IllegalStateException:无法更改片段TstFrag{df80bc8#0 id=0x7f080157的标记android:switcher:2131231063:0}:以前是android:switcher:2131231063:0现在是android:switcher:2131231063:1
方法如下面我的适配器中所示
public class FrgAdapter extends FragmentStatePagerAdapter {
private List<Fragment> mFragmentList = new ArrayList<>();
private List<String> mFragmentTitleList = new ArrayList<>();
public FrgAdapter(FragmentManager fm) {
super(fm);
}
public FrgAdapter(FragmentManager fm, List<Fragment> mFragmentList, List<String> mFragmentTitleList) {
super(fm);
this.mFragmentList = mFragmentList;
this.mFragmentTitleList = mFragmentTitleList;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
public void insertFromJSONObject(JSONObject jsonObject, Fragment fragment, CircularImageView imageView, TextView textView) throws JSONException {
JSONArray dataArray = jsonObject.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
JSONObject sectionObj = (JSONObject) dataArray.get(i);
JSONArray sectionsArray = sectionObj.getJSONArray("section");
for (int j = 0; j < sectionsArray.length(); j++) {
JSONObject obj = (JSONObject) sectionsArray.get(j);
Picasso.get().load(obj.getString("imag")).into(imageView);
mFragmentList.add(fragment);
mFragmentTitleList.add(obj.getString("name"));
textView.setText(obj.getString("name"));
notifyDataSetChanged();
}
}
}
@Override
public CharSequence getPageTitle(int position) {
return null;
}}
这是我的片段。在我看来,每当我需要一个片段时,我都想重用这个片段
public class TstFrag extends Fragment {
public TstFrag() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.layout_cht, container, false);
}}
你可以试试这个:
adapter.insertFromJSONObject(response, view.findViewById(R.id.circularImageView), view.findViewById(R.id.text_header));
adapter.notifyDataSetChanged();
及
public void insertFromJSONObject(JSONObject JSONObject、CircularImageView imageView、TextView TextView)抛出JSONException{
JSONArray dataArray=jsonObject.getJSONArray(“数据”);
对于(int i=0;i
这里的基本思想是为FrgAdapter
的每个条目创建一个新的TstFrag
实例 您可以尝试以下方法:
adapter.insertFromJSONObject(response, view.findViewById(R.id.circularImageView), view.findViewById(R.id.text_header));
adapter.notifyDataSetChanged();
及
public void insertFromJSONObject(JSONObject JSONObject、CircularImageView imageView、TextView TextView)抛出JSONException{
JSONArray dataArray=jsonObject.getJSONArray(“数据”);
对于(int i=0;i
这里的基本思想是为FrgAdapter
的每个条目创建一个新的TstFrag
实例 考虑不手动将片段添加到viewPager
中,但只需在viewPager适配器上实现getItem
和实例化item
方法。然后,viewPager将控制新的TstFrag
的实例化,或者只重用创建的一个检查此项。
@Override
public Fragment getItem(final int pos) {
return TstFrag.getInstance(dataList.get(pos));
}
@NonNull
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
更新
public class DataModel implements Serializable{
private String name;
private String image;
// GETTER && SETTER
}
更换
public class DataModel implements Serializable{
private String name;
private String image;
// GETTER && SETTER
}
私有列表MFFragmentTitleList=new ArrayList()代码>
与
private List<DataModel> dataList = new ArrayList<>();
请考虑不要手动向viewPager
添加片段,但只需在viewPager适配器上实现getItem
和&实例化item
方法。然后,viewPager将控制新的TstFrag
的实例化,或者只重用创建的一个检查此项。
@Override
public Fragment getItem(final int pos) {
return TstFrag.getInstance(dataList.get(pos));
}
@NonNull
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
更新
public class DataModel implements Serializable{
private String name;
private String image;
// GETTER && SETTER
}
更换
public class DataModel implements Serializable{
private String name;
private String image;
// GETTER && SETTER
}
私有列表MFFragmentTitleList=new ArrayList()代码>
与
private List<DataModel> dataList = new ArrayList<>();
在哪里定义了imageView
变量?另外,请张贴TstFrag的代码。谢谢,很抱歉我在没有imageview的情况下进行了尝试,但让我更新编码检查这是在哪里定义的imageview
变量?另外,请张贴TstFrag的代码。谢谢抱歉我在没有imageview的情况下尝试了一下,但让我更新编码检查我花了很长时间才回复,因为我已经解决了这个问题。它可以工作,但现在另一个问题是我得到了选项卡,但它们是空的。即图像和文本没有加载。我会接受这个答案,但是对于任何可能有相同问题的人来说,你应该在fragmentonCreateView
image加载后加载图像,我认为它与fragment onCreateView是同时加载的,因为我在将viewpager连接到适配器的同时调用了获取图像的方法。顺便说一句,到目前为止,我还没有让它工作。尽管片段数量很多,但图像和文本都没有显示出来crreated匹配my JSONArrayIf的长度,如果您只想在对JSON
进行配对时缓存图像。当用户使用幻灯片寻呼机时准备就绪,然后使用Picasso.get().load(imageUrl).fetch(回调)
@Thekamble检查我如何将数据传递到fragment并在fragment上处理呈现UIonCreateView
我花了很长时间才回复,因为我已经解决了这个问题。它可以工作,但现在另一个问题是我得到了选项卡,但是它们是空的。也就是说,图像和文本没有加载。不过,对于任何人来说,我都会接受这个答案可能有同样的问题,你应该在fragmentonCreateView
image加载后加载图像,我认为它与fragment onCreateView是同时加载的,因为我在将viewpager连接到适配器的同时调用了获取图像的方法。顺便说一句,到目前为止,我还没有让它工作。尽管片段数量很多,但图像和文本都没有显示出来crreated匹配my JSONArrayIf的长度,如果您只想在对JSON
进行配对时缓存图像。当用户使用幻灯片寻呼机时准备就绪,然后使用Picasso.get().load(imageUrl).fetch(回调)
@Thekamble检查我如何传递数据