如何在不同的viewpager中使用不同的数据使用相同的片段?

时间:2018-08-08 13:52:04

标签: android android-fragments gridview adapter android-tablayout

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 这是我希望在选择不同选项卡时显示不同数据的gridview类。

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 这是可以相同的片段类。

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

}

1 个答案:

答案 0 :(得分:0)

要支持不同的数据集,必须基于片段将不同的数据传递到适配器。为此,您可以创建一个名为 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
   }
}
相关问题