Android 如何创建基本片段,以便子片段可以从它们扩展到OnCreateView函数中设置适配器?
我有一个从fragment扩展而来的抽象基fragment类。监视器列表片段从此基片段扩展。我需要在每个片段中设置单独的适配器,因为片段中的数据是不同的。问题是,监视器列表片段只返回1个没有数据的片段 在BaseFragment中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
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;
}