android - 如何在回收站视图中单击的项目上将相应的数据返回给 viewpager2?
问题描述
我有数据列表(部门) 在回收站视图中,当我单击 item1 时,我现在在 MyViewPager2 中填充了四个学期片段。如何为 Item2 单击以将其加载到 viewpager2 中的特定学期片段。
笔记:
在第 1 项单击工作正常,第 2 项呢?这些评论说明了我需要的一切。下面是我所拥有的。谢谢
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
}
}
部门RVAdapter.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) {
}
}
学期.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() 返回 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);
}
还要在 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.
推荐阅读
- c# - Winium 无法检测 Office Addin 中的元素
- c# - 带有修订的嵌套项生成慢 SQL 的 Linq 查询
- python - 尝试通过它的Api将Excel从本地上传到A web
- python - 具有相同结构的多个模块的 Python Sphinx
- linux - 即使 container:path 正确,Docker cp 也会失败
- javascript - 在 express.js 中关闭浏览器时 Cookie 过期
- python - 生成行列和对角线之和相等的矩阵
- python - 有人可以帮我按我想要的方式订购这份清单吗?
- kubernetes - kubernetes 服务在离线(没有互联网)k3s 安装时失败
- angular - 将回调函数作为 ionic-angular 中的路由 [navigationExtras] 参数传递