Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何创建基本片段,以便子片段可以从它们扩展到OnCreateView函数中设置适配器?_Android_Android Fragments_Abstract Class_Android Recyclerview - Fatal编程技术网

Android 如何创建基本片段,以便子片段可以从它们扩展到OnCreateView函数中设置适配器?

Android 如何创建基本片段,以便子片段可以从它们扩展到OnCreateView函数中设置适配器?,android,android-fragments,abstract-class,android-recyclerview,Android,Android Fragments,Abstract Class,Android Recyclerview,我有一个从fragment扩展而来的抽象基fragment类。监视器列表片段从此基片段扩展。我需要在每个片段中设置单独的适配器,因为片段中的数据是不同的。问题是,监视器列表片段只返回1个没有数据的片段 在BaseFragment中 public abstract class BaseFragment extends Fragment { private ArrayList<CholesterolMonitor> objectList; private int mCol

我有一个从fragment扩展而来的抽象基fragment类。监视器列表片段从此基片段扩展。我需要在每个片段中设置单独的适配器,因为片段中的数据是不同的。问题是,监视器列表片段只返回1个没有数据的片段

在BaseFragment中

public abstract class BaseFragment extends Fragment {
    private ArrayList<CholesterolMonitor> objectList;
    private int mColumnCount = 1;


public void setObjectList(String listKey){
        if (getArguments()!=null){
            this.objectList= getArguments().getParcelableArrayList(listKey);


        }

@Override
    public View onCreateView(LayoutInflater inflater,ViewGroup parent, Bundle savedInstanseState)
    {
        View view = provideYourFragmentView(inflater,parent,savedInstanseState);
        // Set to recycler view
        if (view instanceof RecyclerView) {
            Context context = view.getContext();
            RecyclerView recyclerView = (RecyclerView) view;
            if (mColumnCount <= 1) {
                recyclerView.setLayoutManager(new LinearLayoutManager(context));
            } else {
                recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
            }

        }

        return view;

    }
        }
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = super.onCreateView(inflater, container,
                savedInstanceState);
        //Set individual adapter
        monitor_list = getObjectList();
        if (v instanceof RecyclerView) {
            RecyclerView recyclerView = (RecyclerView) v;
            adapter = new MonitorListRecyclerAdapter(monitor_list, this.getContext());
            recyclerView.setAdapter(adapter);


        }
        return v;
    }

我发现我在XML中扩展的布局应该是RecyclerView类型。

也许您可以使用抽象方法来创建适配器

这可能无法解决您的问题,但您可以在子片段类中执行适配器逻辑,这样会更清楚

public abstract class BaseFragment extends Fragment {
    private ArrayList<CholesterolMonitor> objectList;
    private int mColumnCount = 1;


    public void setObjectList(String listKey){
        if (getArguments()!=null){
            this.objectList= getArguments().getParcelableArrayList(listKey);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanseState)
    {
        View view = provideYourFragmentView(inflater, parent, savedInstanseState);
        // Set to recycler view
        if (view instanceof RecyclerView) {
            Context context = view.getContext();
            RecyclerView recyclerView = (RecyclerView) view;
            if (mColumnCount <= 1) {
                recyclerView.setLayoutManager(new LinearLayoutManager(context));
            } else {
                recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
            }

            recyclerView.setAdapter(this.createAdapter());
        }

        return view;
    }

    abstract <ViewHolderT extends RecyclerView.ViewHolder, AdapterT extends RecyclerView.Adapter<ViewHolderT>> AdapterT createAdapter();
}


我在没有创建抽象适配器的情况下解决了问题,但我确实认为适配器抽象类会有所帮助。然而,我的onBindViewHolder在这两个片段之间非常不同,我不确定如何在抽象类中定义它。
public class SubFragmentA extends BaseFragment {
    @Override
    SubAdapterA createAdapter() {
        return new SubAdapterA();
    }

    public static class SubAdapterA extends RecyclerView.Adapter<SubViewHolderA> {

        @NonNull
        @Override
        public SubViewHolderA onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            return null;
        }

        @Override
        public void onBindViewHolder(@NonNull SubViewHolderA subViewHolder, int i) {

        }

        @Override
        public int getItemCount() {
            return 0;
        }
    }

    public static class SubViewHolderA extends RecyclerView.ViewHolder {
        public SubViewHolderA(@NonNull View itemView) {
            super(itemView);
        }
    }
}
public class SubFragmentB extends BaseFragment {
    @Override
    SubAdapterB createAdapter() {
        return new SubAdapterB();
    }

    public static class SubAdapterB extends RecyclerView.Adapter<SubViewHolderB> {

        @NonNull
        @Override
        public SubViewHolderB onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            return null;
        }

        @Override
        public void onBindViewHolder(@NonNull SubViewHolderB subViewHolder, int i) {

        }

        @Override
        public int getItemCount() {
            return 0;
        }
    }

    public static class SubViewHolderB extends RecyclerView.ViewHolder {
        public SubViewHolderB(@NonNull View itemView) {
            super(itemView);
        }
    }
}
  public static class BaseViewHolder extends RecyclerView.ViewHolder {

        protected TextView commonTextView;

        public BaseViewHolder(@NonNull View itemView) {
            super(itemView);
            //init commonTextView;
        }
    }

    public static class SubViewHolderB extends BaseViewHolder {

        private TextView textViewB;

        public SubViewHolderB(@NonNull View itemView) {
            super(itemView);
            //init textViewB
        }

        public void bindData(DataModelB data) {
            commonTextView.setText("Common text set Integer data :" + data.intField);
            textViewB.setText("This is Integer :" + data.intField);
        }
    }

    public static class SubViewHolderA extends BaseViewHolder {

        private TextView textViewA;

        public SubViewHolderA(@NonNull View itemView) {
            super(itemView);
            //init textViewB
        }

        public void bindData(DataModelA data) {
            commonTextView.setText("Common text set String data :" + data.strField);
            textViewA.setText("This is String :" + data.strField);
        }
    }

    public static class DataModelB {
        int intField;
    }

    public static class DataModelA {
        String strField;
    }