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("&"," & ");
}
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("&"," & ");
}
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 中创建新片段时都会被调用。
我对 android 非常陌生,我正在尝试动态创建滑动标签并添加可滑动页面,即片段到视图寻呼机。 我看到了一些教程并尝试了一些东西。 我正在粘贴下面相同的代码。
这是我要添加到 viewpager
的片段 classimport 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("&"," & ");
}
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("&"," & ");
}
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 中创建新片段时都会被调用。