如何在具有不同数据的不同 viewpager 中使用相同的片段?
How can I use same fragment in different viewpager with different data?
CategoryPagerAdapter.class
public class CategoryPagerAdapter extends FragmentPagerAdapter {
private Context context;
private String tabs[] = {"Text","Images","Videos"};
public CategoryPagerAdapter(Context context, FragmentManager fm) {
super(fm);
this.context = context;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
Fragment textFragment = new CategoryFragment();
Bundle args = new Bundle();
args.putString("TEXT","textFragment");
textFragment.setArguments(args);
return textFragment;
case 1:
Fragment imageFragment = new CategoryFragment();
Bundle args1 = new Bundle();
args1.putString("IMAGE","imageFragment");
imageFragment.setArguments(args1);
return imageFragment;
case 2:
Fragment videoFragment = new CategoryFragment();
Bundle args2 = new Bundle();
args2.putString("VIDEO","videoFragment");
videoFragment.setArguments(args2);
return videoFragment;
}
return null;
}
@Override
public int getCount() {
return tabs.length;
}
}
CategoryGridViewAdapter.class 这是网格视图class,我想在其中显示不同选项卡选择的不同数据。
public class CategoryGridViewAdapter extends BaseAdapter {
private Context context;
public CategoryGridViewAdapter(Context context) {
this.context = context;
}
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.adapter_category, parent, false);
}
return convertView;
}
}
CategoryFragment.class 这是片段class可以相同
public class CategoryFragment extends Fragment {
Context context;
GridView gv_categories;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
Bundle args = getArguments();
String key = args.getString("TEXT");
if(key.equals("TEXT")){
view = inflater.inflate(R.layout.fragment_category, container, false);
context = view.getContext();
gv_categories = view.findViewById(R.id.gv_categoryGridView);
CategoryGridViewAdapter categoryGridViewAdapter = new CategoryGridViewAdapter(context);
gv_categories.setAdapter(categoryGridViewAdapter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
gv_categories.setNestedScrollingEnabled(true);
}
gv_categories.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent textStatusIntent = new Intent(context, TextStatus.class);
textStatusIntent.putExtra("text",""+position);
context.startActivity(textStatusIntent);
}
return view;
}
}
要支持不同的数据集,您必须需要根据片段将不同的数据传递给您的适配器。为此,您可以创建一个接口 Item 并为所有 TextItem、ImageItem 和 VideoItem.
提供该接口的实现
这是您可能会用到的粗略想法。
public interface Item {
String getName();
String getType();
String getDescription();
// Add methods as many you need
}
public class TextItem implements Item {
// implement all the methods
}
public class ImageItem implements Item {
// implement all the methods
}
public class VideoItem implements Item {
// implement all the methods
}
然后将 List<Item>
传递给每个片段的适配器。
最后修改你的 CategoryGridViewAdapter
.
private List<Item> listItem;
public CategoryGridViewAdapter(Context context, List<Item> listItem ) {
this.context = context;
this.listItem = listItem;
}
@Override
public int getCount() {
return listItem.size();
}
@Override
public Object getItem(int position) {
return listItem.get(position);
}
相应地修改您的 CategoryFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle args = getArguments();
if(args.contains("TEXT")){
// do stuff related to TEXT
} else if(args.contains("IMAGE")){
// do stuff related to IMAGE
} else if(args.contains("VIDEO")){
// do stuff related to VIDEO
}
}
CategoryPagerAdapter.class
public class CategoryPagerAdapter extends FragmentPagerAdapter {
private Context context;
private String tabs[] = {"Text","Images","Videos"};
public CategoryPagerAdapter(Context context, FragmentManager fm) {
super(fm);
this.context = context;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
Fragment textFragment = new CategoryFragment();
Bundle args = new Bundle();
args.putString("TEXT","textFragment");
textFragment.setArguments(args);
return textFragment;
case 1:
Fragment imageFragment = new CategoryFragment();
Bundle args1 = new Bundle();
args1.putString("IMAGE","imageFragment");
imageFragment.setArguments(args1);
return imageFragment;
case 2:
Fragment videoFragment = new CategoryFragment();
Bundle args2 = new Bundle();
args2.putString("VIDEO","videoFragment");
videoFragment.setArguments(args2);
return videoFragment;
}
return null;
}
@Override
public int getCount() {
return tabs.length;
}
}
CategoryGridViewAdapter.class 这是网格视图class,我想在其中显示不同选项卡选择的不同数据。
public class CategoryGridViewAdapter extends BaseAdapter {
private Context context;
public CategoryGridViewAdapter(Context context) {
this.context = context;
}
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.adapter_category, parent, false);
}
return convertView;
}
}
CategoryFragment.class 这是片段class可以相同
public class CategoryFragment extends Fragment {
Context context;
GridView gv_categories;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
Bundle args = getArguments();
String key = args.getString("TEXT");
if(key.equals("TEXT")){
view = inflater.inflate(R.layout.fragment_category, container, false);
context = view.getContext();
gv_categories = view.findViewById(R.id.gv_categoryGridView);
CategoryGridViewAdapter categoryGridViewAdapter = new CategoryGridViewAdapter(context);
gv_categories.setAdapter(categoryGridViewAdapter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
gv_categories.setNestedScrollingEnabled(true);
}
gv_categories.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent textStatusIntent = new Intent(context, TextStatus.class);
textStatusIntent.putExtra("text",""+position);
context.startActivity(textStatusIntent);
}
return view;
}
}
要支持不同的数据集,您必须需要根据片段将不同的数据传递给您的适配器。为此,您可以创建一个接口 Item 并为所有 TextItem、ImageItem 和 VideoItem.
提供该接口的实现这是您可能会用到的粗略想法。
public interface Item {
String getName();
String getType();
String getDescription();
// Add methods as many you need
}
public class TextItem implements Item {
// implement all the methods
}
public class ImageItem implements Item {
// implement all the methods
}
public class VideoItem implements Item {
// implement all the methods
}
然后将 List<Item>
传递给每个片段的适配器。
最后修改你的 CategoryGridViewAdapter
.
private List<Item> listItem;
public CategoryGridViewAdapter(Context context, List<Item> listItem ) {
this.context = context;
this.listItem = listItem;
}
@Override
public int getCount() {
return listItem.size();
}
@Override
public Object getItem(int position) {
return listItem.get(position);
}
相应地修改您的 CategoryFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle args = getArguments();
if(args.contains("TEXT")){
// do stuff related to TEXT
} else if(args.contains("IMAGE")){
// do stuff related to IMAGE
} else if(args.contains("VIDEO")){
// do stuff related to VIDEO
}
}