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

时间:2015-09-23 10:17:18

标签: android android-fragments android-viewpager android-tablayout

我非常喜欢android,我正在尝试动态创建滑动标签并添加可转换页面,即片段到视图寻呼机。 我看了一些教程并尝试了一些方法。 我粘贴下面的代码。

这是我添加到viewpager的片段类

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;
        }
    }
}

我在上一个活动中的异步任务中从服务器检索json(json-array)数据,并以构造函数中的字符串形式将其传递给此fragement。

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

问题

如果你看到,我将类别id传递给viewpager的每个片段,它应该在每个片段中设置相应的类别,但这里发生的是它只是在第一个片段中设置id或称之为第一个选项卡休息所有片段只显示文本&#34;类别ID&#34;而不是当我向第二个片段滑动时要设置的类别,在第一个片段中设置第二个片段的cateory id,当我滑动到第三个片段时,第三个片段的类别id被设置为第一个< / p>

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

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

1 个答案:

答案 0 :(得分:0)

在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可能只调用一次,而每次在viewpager中创建新片段时都会调用onCreateView。