【问题标题】:How can I use same fragment in different viewpager with different data?如何在具有不同数据的不同 viewpager 中使用相同的片段?
【发布时间】:2018-08-08 13:52:04
【问题描述】:

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

}

【问题讨论】:

  • 您只需将数据列表传递给您的适配器类,除了一切看起来都很好。请详细说明您想做什么。
  • 我也收到错误 - java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on an null object reference at com .sharestatus.fragment.CategoryFragment.onCreateView(CategoryFragment.java:42) stackoverflow.com/users/3503023/krishna-sharma
  • 解决 NPE 像这样改变你的代码 Bundle args = getArguments(); if(args.contains("TEXT")){ } else if(args.contains("IMAGE")){ } else if(args.contains("VIDEO")){ }

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


【解决方案1】:

要支持不同的数据集,您必须根据片段将不同的数据传递给您的适配器。为此,您可以创建一个接口,例如 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&lt;Item&gt; 传递给每个片段的适配器。

最后修改你的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
   }
}

【讨论】:

  • 这里我想只使用一个 Fragment 在 gridview 项目中添加不同的类别数据
  • 知道了!在更新的答案中查看修改后的CategoryFragment.onCreateView
  • 请告诉我,我开发了一个应用程序,并且有一个三个选项卡,文本、图像、视频,所以当我单击图像的类别时,每个选项卡都有不同的类别,意图只会传递给该类别图片选项卡,三个tabLayout只使用一个fragment,
  • @BhaveshMakwana 你已经做对了,你只为所有人创建了一个名为CategoryFragment 的片段,其中包含CategoryGridViewAdapter。现在您只需将不同的数据集传递给适配器。
  • 如果您对每个项目都有复杂的日志,那么我建议您创建三个不同的片段。您仍然可以通过创建抽象BaseFragment 并为ImageFragemnt, TextFragment and VideoFragment 扩展它来为通用逻辑编写通用代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多