【问题标题】:How can I Create a generic method for these?如何为这些创建通用方法?
【发布时间】:2021-04-28 20:24:44
【问题描述】:

请问如何为这两个通用片段列表中的每一个创建方法??

作为构造函数不允许我创建多个 这些方法中。

  1. 我想创建一个类似于构造函数的方法Semesters (int position){ mData=getCsList(位置); }

当我运行程序时,我的构造函数被编译器调用,它完成了我想要的工作。我如何通过创建和使用执行相同工作的方法来实现这一点,因为我有很多片段列表,并且由于它的参数签名,承包商不允许我这样做,这就是为什么我想使用方法并始终保持相同的签名。谢谢

....... 编辑代码............

SemesterFragment.java

 package com.example.viewpager2;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;

import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

public class SemesterFragment extends Fragment {
    TabLayout tabLayout;
    ViewPager2 viewPager2;
    MyViewPager adapter;

    public SemesterFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_semester, container, false);
        viewPager2 = (ViewPager2) view.findViewById(R.id.viewPager2);
        tabLayout = view.findViewById(R.id.tabLayout);
        adapter = new MyViewPager(getChildFragmentManager(), this.getLifecycle());
        viewPager2.setAdapter(adapter);
        new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                tab.setText("Sem" + (position + 1));
            }
        }).attach();
        addComputerScienceSem();
        adapter.notifyDataSetChanged();
        return view;
    }

    private void addComputerScienceSem() {
        adapter.addFrags(new Semesters().newInstance(0, 1));
        adapter.addFrags(new Semesters().newInstance(0, 2));
        adapter.addFrags(new Semesters().newInstance(0, 3));
        adapter.addFrags(new Semesters().newInstance(0, 4));
    }
}

MyViewPager.java

package com.example.viewpager2;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.ArrayList;
import java.util.List;

public class MyViewPager extends FragmentStateAdapter {
    List<Fragment> fragmentList = new ArrayList<>();

    public MyViewPager(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList.size();
    }

    public void addFrags(Fragment fragment) {
        fragmentList.add(fragment);
    }
}

学期.java

 package com.example.viewpager2;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class Semesters extends Fragment {
    List mData;
    RVFragment adapter;
    RecyclerView recyclerView;

    public Semesters() {
    }

    public static Semesters newInstance(int index, int position) {
        Semesters fragment = new Semesters();
        Bundle args = new Bundle();
        args.putInt("index", index);
        args.putInt("position", position);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);
        recyclerView = view.findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);
        adapter = new RVFragment(getContext(), mData);
        if (getArguments().getInt("index", 0) == 0) {
            mData = getCSList(getArguments().getInt("position", 0));
        } else if (getArguments().getInt("index", 0) == 1) {
            mData = getSTAList(getArguments().getInt("position", 0));
        }
        recyclerView.setAdapter(adapter);
        return view;
    }

    private List getCSList(int position) {
        List list = new ArrayList<>();
        if (position == 0) { //fragment one inside viewpager whenever item1 is clicked from the recyclerView 
            list.add(new SemesterModelClass("intro. to comp", "com101", "3"));
            list.add(new SemesterModelClass("digital electonics", "com112", "3"));
            list.add(new SemesterModelClass("intro to programming", "com113", "4"));
        } else if (position == 1) { //fragment two inside viewpager whenever item1 is clicked from the recyclerView 
            list.add(new SemesterModelClass("sem2", "com111", "3"));
            list.add(new SemesterModelClass("sem2", "com222", "5"));
            list.add(new SemesterModelClass("sem2", "com121", "4"));
        } else if (position == 2) { //fragment three inside viewpager whenever item1 is clicked from the recyclerView 
            list.add(new SemesterModelClass("sem3", "com111", "3"));
            list.add(new SemesterModelClass("sem3", "com222", "5"));
            list.add(new SemesterModelClass("sem3", "com121", "4"));
        } else if (position == 3) { //fragment four inside viewpager whenever item1 is clicked from the recyclerView 
            list.add(new SemesterModelClass("sem4", "com111", "3"));
            list.add(new SemesterModelClass("sem4", "com222", "5"));
            list.add(new SemesterModelClass("sem4", "com121", "4"));
        }
        return list;
    }

    private List getSTAList(int position) {
        List list = new ArrayList<>();
        if (position == 4) { //fragment one inside viewpager whenever item2 is clicked from the recyclerView 
            list.add(new SemesterModelClass("probability", "STA 111", "3"));
            list.add(new SemesterModelClass("algebra", "STA 112", "4"));
            list.add(new SemesterModelClass("logic", "STA 113", "3"));
            list.add(new SemesterModelClass("geometri func", "STA 114", "4"));
        } else if (position == 5) { //fragment two inside viewpager whenever item2 is clicked from the recyclerView 
            list.add(new SemesterModelClass("set theory", "STA 111", "3"));
            list.add(new SemesterModelClass("dedvwvdv", "STA 112", "4"));
            list.add(new SemesterModelClass("fbcfvdv", "STA 113", "3"));
            list.add(new SemesterModelClass("cvsvsdvs", "STA 114", "4"));
        } else if (position == 6) { //fragment three inside viewpager whenever item2 is clicked from the recyclerView 
            list.add(new SemesterModelClass("geo", "STA 111", "3"));
            list.add(new SemesterModelClass("semdvbv3", "STA 112", "4"));
            list.add(new SemesterModelClass("dedgsedv", "STA 113", "3"));
            list.add(new SemesterModelClass("frgs", "STA 114", "4"));
        } else if (position == 7) { //fragment four inside viewpager whenever item2 is clicked from the recyclerView 
            list.add(new SemesterModelClass("log", "STA 111", "3"));
            list.add(new SemesterModelClass("sem4fff", "STA 112", "4"));
            list.add(new SemesterModelClass("sem4gtgg", "STA 113", "3"));
            list.add(new SemesterModelClass("sem4uku", "STA 114", "4"));
        }
        return list;
    }
}

........编辑了这个..............

部门RVAdapter.java

 public void onClick(View v){


    clickInterface.onItemClickListener(getLayoutPosition());
        switch(getAdapterPosition()){
        //loads department best on the position that user click
        case 0:                         // it loads all departments in the school
        Objects.requireNonNull(departmentFragment.getActivity()).getSupportFragmentManager().beginTransaction() //
        .setCustomAnimations(R.anim.slide_in_left,R.anim.exit_to_right)
        .replace(R.id.frameLayout,new SemesterFragment()).addToBackStack(null).commit();break;

     case 1:                         // it loads all departments in the school
        
Objects.requireNonNull(departmentFragment.getActivity()).getSupportFragmentManager().beginTransaction() //
        .setCustomAnimations(R.anim.slide_in_left,R.anim.exit_to_right)
        .replace(R.id.frameLayout,new SemesterFragment()).addToBackStack(null).commit();break;

}

【问题讨论】:

  • 格式很好,很好用

标签: android android-fragments android-recyclerview android-viewpager2


【解决方案1】:

我不明白为什么不能使用相同的构造函数。在 mData1 之后声明另一个名为 mData2 的字段

public class Semesters extendss Fragment{ 
List<SemesterModelClass> mData;
List<SemesterModelClass> mData2;

现在像这样在构造函数中调用mData2 = getStaList(position);

public Semesters(int position) {
    mData = getCsList(position);
    mData2 = getStaList(position);
}

---------------------- 编辑 ----------------------

将 ViewPager 设置为像这样工作。使用这样的静态方法。第一页为 0,第二页为 1

public class Semesters extendss Fragment {
    List < SemesterModelClass > mData;

    public static Semesters newInstance(int index, int position) {

        Semesters f = new Semesters();
        Bundle args = new Bundle();
        args.putInt("index", index);
        args.putInt("postion", postion);
        f.setArguments(args);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        if (getArguments().getInt("index", 0) == 0) {
            mData = getCsList(getArguments().getInt("position", 0))
        } else if (getArguments().getInt("index", 0) == 1) {
            mData = getStaList(getArguments().getInt("position", 0))
        }
    }

}

【讨论】:

  • '@Robin,我很感激,这样下去它会起作用,但我有一个可以容纳 4 个碎片的 viewpager,当我调用这个构造函数时 public Semesters(int position) { mData = getCsList (position) mData2 = getStaList(position) 在 vi​​ewpager 内它将填充 8 个碎片而不是仅添加 4 个碎片,无论是 getCsList(position) 还是 getStaList(position) ,我为什么要这样做就是这样,我希望如果用户在回收站视图中单击 item1,它将采用 getCsList(position) 并填充到 viewpager 内的 4 个碎片,如果单击 item2,则它将采用 getStaList(position) 并填充
  • 已编辑代码以便为带有片段参数的动态位置留出空间
  • 我已经编辑了代码,但是我可以在哪里使用呢?以上是完整代码请帮忙
  • 这里的想法是不要直接调用 new Semester() 而是调用静态方法来帮助实例化类并返回它。致电Semester.newInstace(getLayoutPosition(), position) 请注意,位置相同,但填充的列表将根据适配器位置索引而有所不同。您使用 getLayoutPosition() 而不是 getAdapterPosition() 是否有原因?
  • 部门RVAdapter.java ??我尝试使用 getAdapterPosition() 代替 getLayoutPosition() 但它不起作用。比如说,case:0(即来自 RV 的 Item1),然后填充 getCSList(...),如果 case:1(来自 RV 的 Item2)然后填充 getStaList (...) b>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2017-10-20
  • 1970-01-01
  • 2021-12-13
  • 2016-09-11
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多