Android:动态视图寻呼机仅显示第一个片段中的更改

Android : Dynamic View Pager Just showing Changes in the first fragment

我对 android 非常陌生,我正在尝试动态创建滑动标签并添加可滑动页面,即片段到视图寻呼机。 我看到了一些教程并尝试了一些东西。 我正在粘贴下面相同的代码。

这是我要添加到 viewpager

的片段 class
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import technovators.mahendraprophecy.R;

/**
 * A simple {@link android.app.Fragment} subclass.
 */
public class SUB_LIST_FRAGMENT extends android.support.v4.app.Fragment {

    static String category;

    public SUB_LIST_FRAGMENT() {
        // Required empty public constructor
    }
    public static final SUB_LIST_FRAGMENT newInstance(String message)

    {
        category=message;
        SUB_LIST_FRAGMENT f = new SUB_LIST_FRAGMENT();
        Bundle bdl = new Bundle(1);
        return f;
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        Toast.makeText(getActivity(),category,Toast.LENGTH_LONG).show();
        ((TextView) getActivity().findViewById(R.id.cat)).setText(category);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.sub_list_fragment, container, false);
    }

}

这是主要片段,它附有选项卡和一个 viewpager

public class LATEST_NEWSLETTERS extends android.support.v4.app.Fragment {


    MaterialTabs subTabs;
    ViewPager subPager;
    private String[] titles = new String[]{"Weekly Newsletter", "Market News & Updates", "Day Trade Flash News"};
    ArrayList<String> headers,header_colors,category_ids;
    List<Fragment> fList;
    public LATEST_NEWSLETTERS()
    {

    }

    public LATEST_NEWSLETTERS(String categoryData)
    {
        try
        {
            JSONObject object=new JSONObject(categoryData);
            JSONArray array=object.getJSONArray("categories");
            headers=new ArrayList<>();
            header_colors=new ArrayList<>();
            category_ids=new ArrayList<>();
            fList = new ArrayList<Fragment>();

            for(int i=0;i<array.length();i++)
            {
                object=array.getJSONObject(i);
                headers.add(object.getString("name"));
                header_colors.add(object.getString("bgcolor"));
                category_ids.add(object.getString("cat_id"));
                fList.add(SUB_LIST_FRAGMENT.newInstance(object.getString("cat_id")));
            }
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }

    }

    void setupTabs()
    {
        subTabs= (MaterialTabs) getActivity().findViewById(R.id.subTabs);
        subPager= (ViewPager) getActivity().findViewById(R.id.subPager);
        latestNewLetterAdapter adapter=new latestNewLetterAdapter(getFragmentManager());
        subPager.setAdapter(adapter);
        subTabs.setViewPager(subPager);
        subTabs.setIndicatorColor(Color.parseColor(header_colors.get(0)));
        subTabs.setTextColorSelected(Color.parseColor(header_colors.get(0)));

        subPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
        {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position)
            {
                subTabs.setIndicatorColor(Color.parseColor(header_colors.get(position)));
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.mainfragment_latest_newsletters, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setupTabs();
    }


    class latestNewLetterAdapter extends FragmentStatePagerAdapter implements MaterialTabs.CustomTabProvider
    {
        public latestNewLetterAdapter(FragmentManager fm)
        {
            super(fm);
        }

        @Override
        public Fragment getItem(int position)
        {
            return fList.get(position);
        }


        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // TODO Auto-generated method stub

        }

/*
        @Override
        public CharSequence getPageTitle(int position)
        {
            String x=headers.get(position);
            if(x.contains("&"))
            {
              x=x.replaceAll("&amp;"," & ");
            }
            return x;
        }
*/
        @Override
        public int getCount()
        {
            return headers.size();
        }

        @Override
        public View getCustomTabView(ViewGroup viewGroup, int i) {
            TextView header=new TextView(getActivity());
            String x=headers.get(i);
            if(x.contains("&"))
            {
                x=x.replaceAll("&amp;"," & ");
            }
            header.setTextColor(Color.parseColor(header_colors.get(i)));
            header.setText(x);
            header.setGravity(Gravity.CENTER);
            return header;
        }
    }
}

我正在使用前面 activity 中的异步任务从服务器检索 json (json-array) 数据,并在构造函数中以字符串的形式将其传递给此片段.

适配器用标题填充选项卡,并从片段的自定义构造函数中创建的片段列表中获取项目 class,我还读到使用自定义构造函数不是一个好习惯,我将为相同目的实现接口,但这不是这里的主要问题。

问题

如果你看到了,我将类别 ID 传递给 viewpager 的每个片段,它应该在每个片段中设置相应的类别,但这里发生的是它只是在第一个片段中设置 id 或称它为第一个选项卡其余所有片段仅显示文本 "category id" 而不是要设置的类别,而不是当我滑动到第二个片段时第二个片段的类别 ID 设置在第一个片段中,当我滑动到第三个片段时片段第三个的类别id设置为第一个

所以基本上所有的动作都只发生在第一个片段而不是全部。

请帮我看看哪里错了? 我需要添加动态页面,因为类别的数量每次都在变化,因此应该将页面数量添加到视图寻呼机中,并且将在与该页面的类别 ID 相对应的每个页面中加载一个列表。

在您的 SUB_LIST_FRAGMENT 中,尝试将您的代码从 onActivityCreated 移动到 onCreateView。结果应如下所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View inflatedView = inflater.inflate(R.layout.sub_list_fragment, container, false);
    ((TextView) inflatedView.findViewById(R.id.cat)).setText(category);
}

onActivityCreated 可能只被调用一次,而 onCreateView 每次在您的 viewpager 中创建新片段时都会被调用。