Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从web服务将ViewPager中的片段添加到TableLayout?_Android_Android Fragments_Android Viewpager_Android Tablayout - Fatal编程技术网

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的情况下尝试了一下,但让我更新编码检查我花了很长时间才回复,因为我已经解决了这个问题。它可以工作,但现在另一个问题是我得到了选项卡,但它们是空的。即图像和文本没有加载。我会接受这个答案,但是对于任何可能有相同问题的人来说,你应该在fragment
onCreateView
image加载后加载图像,我认为它与fragment onCreateView是同时加载的,因为我在将viewpager连接到适配器的同时调用了获取图像的方法。顺便说一句,到目前为止,我还没有让它工作。尽管片段数量很多,但图像和文本都没有显示出来crreated匹配my JSONArrayIf的长度,如果您只想在对
JSON
进行配对时缓存图像。当用户使用幻灯片寻呼机时准备就绪,然后使用
Picasso.get().load(imageUrl).fetch(回调)
@Thekamble检查我如何将数据传递到fragment并在fragment上处理呈现UI
onCreateView
我花了很长时间才回复,因为我已经解决了这个问题。它可以工作,但现在另一个问题是我得到了选项卡,但是它们是空的。也就是说,图像和文本没有加载。不过,对于任何人来说,我都会接受这个答案可能有同样的问题,你应该在fragment
onCreateView
image加载后加载图像,我认为它与fragment onCreateView是同时加载的,因为我在将viewpager连接到适配器的同时调用了获取图像的方法。顺便说一句,到目前为止,我还没有让它工作。尽管片段数量很多,但图像和文本都没有显示出来crreated匹配my JSONArrayIf的长度,如果您只想在对
JSON
进行配对时缓存图像。当用户使用幻灯片寻呼机时准备就绪,然后使用
Picasso.get().load(imageUrl).fetch(回调)
@Thekamble检查我如何传递数据