我如何 return 将在回收站视图中单击的项目的相应数据发送到 viewpager2?

How do I return the respective data to viewpager2 on an item clicked in a recycler view?

我有数据(部门)列表 在回收站视图中,当我单击 item1 时,我现在在 MyViewPager2 中填充 四个 个学期片段。我如何为 Item2 做点击以在 viewpager2 中加载它的特定学期片段。

注:

Item1 上的点击效果很好,item2 呢?这些评论说明了我需要的一切。以下是我所拥有的。谢谢

MyViewPager2.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;

public class MyViewPager2  extends FragmentStateAdapter {

    public MyViewPager2(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }
    @NonNull
    @Override
    public Fragment createFragment(int position) {
        //this returns Semester(position) but only the data for an item2 clicked in a recyclerview display
        // to me is like here, will return all data inside viewpager in their respective item clicked
        return new Semesters(position);
    }
    @Override
    public int getItemCount() {
        return 4;// i have changing this to 8 two but kept on inflate the same item Clicked
    }
}

DepartmentRVAdapter.java

package com.example.viewpager2;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;
import java.util.Objects;

public class DepartmentRVAdapter extends RecyclerView.Adapter<DepartmentRVAdapter.MyViewHolder> {
    List<DepartmentModel> mData;
    LayoutInflater inflater;
    Context context;
    ClickInterface clickInterface;
    DepartmentFragment departmentFragment;

    public DepartmentRVAdapter(List<DepartmentModel> mData, Context context, ClickInterface clickInterface, DepartmentFragment sf) {
        this.mData=mData;
        this.context=context;
        this.clickInterface=clickInterface;
        departmentFragment =sf;
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.row_department_xml,parent,false);
        MyViewHolder vh = new MyViewHolder(view);
        return vh;
    }
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.imgDepLogo.setImageResource(mData.get(position).getDepLogo());
        holder.tvDepName.setText(mData.get(position).getDepName());
    }
    @Override
    public int getItemCount() {
        return mData.size();
    }
    public class MyViewHolder extends RecyclerView.ViewHolder{
        ImageView imgDepLogo;
        TextView tvDepName;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imgDepLogo = itemView.findViewById(R.id.imgDeptLogo);
            tvDepName = itemView.findViewById(R.id.tvDepName);
            tvDepName.setOnClickListener(new View.OnClickListener() {
                @Override
                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_left,R.anim.enter_from_right,R.anim.exit_to_left)
//                                        .replace(R.id.frameLayout,new SemesterFragment())
//                                        .addToBackStack(null).
//                                        commit();
//                        break;
                    }
                }
            });
        }
    }
}

DepartmentFragment.java

package com.example.viewpager2;

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

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 DepartmentFragment extends Fragment implements ClickInterface {
    List<DepartmentModel> mData;
    DepartmentRVAdapter adapter;
    RecyclerView recyclerView;

    public DepartmentFragment() {

    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       View view = inflater.inflate(R.layout.fragment_start,container,false);
        recyclerView = view.findViewById(R.id.recyclerView);

        mData = new ArrayList<>();
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(linearLayoutManager);
        adapter = new DepartmentRVAdapter(mData,getContext(),this, DepartmentFragment.this);
        //list of departments in the school
        mData.add(new DepartmentModel("Computer Science",R.drawable.glogo));
        mData.add(new DepartmentModel("Statistic",R.drawable.horse));

        recyclerView.setAdapter(adapter);
        return view;
    }
    //here implement interface class methods
    @Override
    public void onItemClickListener(int position) {
        Toast.makeText(getContext(),"clicked " + mData.get(position).getDepName(), Toast.LENGTH_LONG).show();

    }
    @Override
    public void onItemLongClickListener(int position) {

    }
}

Semesters.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.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

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

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

    public Semesters(int position) {
        mData = getList(position);
    }
    @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);
        recyclerView.setAdapter(adapter);
        return view;
    }
    //Note:
    //It worked perfect when the user click on ITEM1 (ONE) in the recyclerview.
    //What i want is for the ITEM2 (TWO) to do thesame
    private List<SemesterModelClass> getList(int position) {
        List<SemesterModelClass> list = new ArrayList<>();
            // onItem1 (one) clicked in a recyclerview,
            // these data are populated in their respective fragment in a viewpager2
        if (position == 0) {
            // this populate first semester fragment inside viewpager2
            // if the user click on item1 in a recyclerView
            list.add(new SemesterModelClass("sem1", "com111", "3"));
            list.add(new SemesterModelClass("sem1", "com222", "5"));
            list.add(new SemesterModelClass("sem1", "com121", "4"));
        } else if (position == 1) {
            // this populate second semester fragment inside viewpager2
            // if the user click on item1 in a 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) {
            // this populate third semester fragment inside viewpager2
            // if the user click on item1 in a recyclerView
            list.add(new SemesterModelClass("sem3", "com111", "3"));
            list.add(new SemesterModelClass("sem3", "com222", "5"));
            list.add(new SemesterModelClass("sem3", "com121", "4"));
        } else {
            // this populate fourth semester fragment inside viewpager2
            // if the user click on item1 in a recyclerView
            list.add(new SemesterModelClass("sem4", "com111", "3"));
            list.add(new SemesterModelClass("sem4", "com222", "5"));
            list.add(new SemesterModelClass("sem4", "com121", "4"));
        }
        return list;
    }
    //***********************************************************************************************
    // onItem2 (two) clicked in a recyclerview,
    // i want to do thesame thing without creating another similar class like this

    private  List<SemesterModelClass>  getList(int position){
        List<SemesterModelClass> list = new ArrayList<>();

        if(position == 0) {
            // i want to populate first semester fragment inside viewpager2
            // if the user click on item2 (two) in a recyclerView
            list.add(new SemesterModelClass("sem1 descriptive", "STA 111", "3"));
            list.add(new SemesterModelClass("sem1 set theory", "STA 112", "4"));
            list.add(new SemesterModelClass("sem1 algebra", "STA 113", "3"));
            list.add(new SemesterModelClass("sem1 logic", "STA 114", "4"));
        }else if(position == 1) {
            // i want to populate second semester fragment inside viewpager2
            // if the user click on item2 (two) in a recyclerView
            list.add(new SemesterModelClass("sem1 descriptive", "STA 111", "3"));
            list.add(new SemesterModelClass("sem1 set theory", "STA 112", "4"));
            list.add(new SemesterModelClass("sem1 algebra", "STA 113", "3"));
            list.add(new SemesterModelClass("sem1 logic", "STA 114", "4"));
        }else if(position == 2) {
            // i want to populate third semester fragment inside viewpager2
            // if the user click on item2 (two) in a recyclerView
            list.add(new SemesterModelClass("sem1 descriptive", "STA 111", "3"));
            list.add(new SemesterModelClass("sem1 set theory", "STA 112", "4"));
            list.add(new SemesterModelClass("sem1 algebra", "STA 113", "3"));
            list.add(new SemesterModelClass("sem1 logic", "STA 114", "4"));
        }else{
            // i want to populate fourth semester fragment inside viewpager2
            // if the user click on item2 (two) in a recyclerView
            list.add(new SemesterModelClass("sem1 descriptive", "STA 111", "3"));
            list.add(new SemesterModelClass("sem1 set theory", "STA 112", "4"));
            list.add(new SemesterModelClass("sem1 algebra", "STA 113", "3"));
            list.add(new SemesterModelClass("sem1 logic", "STA 114", "4"));
        }
        return list;
    }
}

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;
    MyViewPager2 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 MyViewPager2(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();
        return view;
    }
}

问题是您没有向采用者添加片段。如果我们说 getItemCount() returns 4.

它不会自己完成所有操作

修改 MyViewPager2.java,将您的 CreateFragment 方法替换为类似的东西。

   public Fragment createFragment(int position) {
   // the following should work but I would prefer to have more control over things so would use fragment list. 
   //return new Semesters(position);
   // like this
   return mSemestersList.get(position);
  }

接下来您必须定义一个方法来将片段添加到您的列表中。

public void addFragment(Fragment fragment, String title ){
    this.mFragmentsList.add(fragment);
    this.mFragmentsTitleList.add(title);
}

还有 return getItemCount 方法中 mFragmentsList 的大小。

最后在您的 SemesterFragment.java 中调用 addFragment()。

 adapter = new MyViewPager2(getChildFragmentManager(),this.getLifecycle());
 adapter.addFragment(new Semesters(1),"Fall Semester 1");
 // and so on for all four semesters.