Android中的ViewPager + RecyclerView问题

编程入门 行业动态 更新时间:2024-10-28 06:26:24
本文介绍了Android中的ViewPager + RecyclerView问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有Tablayout和Viewpager,并且我正在使用Fragment进行布局.现在在每个Tablayout片段中都有Recyclerview并显示项目.请参阅我的json响应

Hi I have Tablayout with Viewpager and i am using Fragment for tablayout. Now in every Tablayout fragments I have Recyclerview and displaying items.Please See this my json response

pastebin/nUswad9s

在"typeMaster"中:数组我有类别"typeName":"Dogs",并且我在tablayout中显示类型名,我有4个tablayout,并且在typemaster中,我有名为"catMaster"的子类别:并且我正尝试显示catmaster数据在recyclerview中,但问题在于它显示了最后一个数据"catName"的每个片段:维生素和矿物质",

here in "typeMaster": array i have categories "typeName": "Dogs", and i am displaying typenames in tablayout i have 4 tablayout, and inside typemaster i have subcategoreis named "catMaster": and i am trying to display catmaster data in recyclerview,but the issue is in every fragment it shows last data "catName": "Vitamins & Minerals",

活动

public class CategoriesActivity extends AppCompatActivity{ private Header myview; private ArrayList<SubcategoryModel> subct; private ArrayList<CategoryModel> filelist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.categoris_activity); filelist = (ArrayList<CategoryModel>)getIntent().getSerializableExtra("categorylist"); System.out.println("Category list size"+filelist.size()); myview = (Header) findViewById(R.id.categorisactivity_headerView); myview.setActivity(this); TabLayout tabLayout = (TabLayout) findViewById(R.id.cat_tab_layout); for(int i = 0; i < filelist.size(); i++){ subct=filelist.get(i).getItems(); for(int j=0;j<subct.size();j++) { } System.out.println("SubCategory list size"+subct.size()); } for(int i = 0; i < filelist.size(); i++){ tabLayout.addTab(tabLayout.newTab().setText(filelist.get(i).getCategory_typename())); ArrayList<SubcategoryModel> subct=filelist.get(i).getItems(); for(int j=0;j<subct.size();j++) { } } Bundle bundleObject = new Bundle(); bundleObject.putSerializable("key", filelist); FirstFragment ff=new FirstFragment(); ff.setArguments(bundleObject); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final ViewPager viewPager = (ViewPager) findViewById(R.id.categories_pager); CategoriesAdapter mPagerAdapter = new CategoriesAdapter(getSupportFragmentManager(),tabLayout.getTabCount()); viewPager.setAdapter(mPagerAdapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } public class CategoriesAdapter extends FragmentStatePagerAdapter { ArrayList<CategoryModel> catlist; int numoftabs; public CategoriesAdapter(FragmentManager fm, int numoftabs) { super(fm); this.numoftabs = numoftabs; } @Override public Fragment getItem(int position) { Log.v("adapter", "getitem" + String.valueOf(position)+subct.size()); return FirstFragment.create(position,subct); } @Override public int getCount() { return numoftabs; } } }

片段

public class FirstFragment extends Fragment { // Store instance variables public static final String ARG_PAGE = "page"; private int mPageNumber; private Context mContext; private int Cimage; private ArrayList<SubcategoryModel> subcatlist; private RecyclerView rcylervw; private ArrayList<CategoryModel> filelist; ArrayList<SubcategoryModel> subct; public static FirstFragment create(int pageNumber,ArrayList<SubcategoryModel> subct){ FirstFragment fragment = new FirstFragment(); Bundle args = new Bundle(); args.putInt(ARG_PAGE, pageNumber); args.putSerializable("key", subct); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPageNumber = getArguments().getInt(ARG_PAGE); subct= (ArrayList<SubcategoryModel>) getArguments().getSerializable("key"); System.out.println("Frag Category list size"+subct.size()); /* for(int i = 0; i < filelist.size(); i++){ subct=filelist.get(i).getItems(); for(int j=0;j<subct.size();j++) { } System.out.println("Frag SubCategory list size"+subct.size()); }*/ // image uri get uri of image that saved in directory of app } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater .inflate(R.layout.test, container, false); rcylervw=(RecyclerView)rootView.findViewById(R.id.subcategory_recycler_view); rcylervw.setHasFixedSize(true); MyAdapter adapter = new MyAdapter(subct); rcylervw.setAdapter(adapter); LinearLayoutManager llm = new LinearLayoutManager(getActivity()); rcylervw.setLayoutManager(llm); return rootView; } // this method is not very important }

MyAdapter

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private ArrayList<SubcategoryModel> mDataset; public static class MyViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public MyViewHolder(View v) { super(v); mTextView = (TextView) v.findViewById(R.id.subcategory_text); } } // Provide a suitable constructor (depends on the kind of dataset) public MyAdapter(ArrayList<SubcategoryModel> myDataset) { mDataset = myDataset; } // Create new views (invoked by the layout manager) @Override public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item_subcategory, parent, false); // set the view's size, margins, paddings and layout parameters MyViewHolder vh = new MyViewHolder(v); return vh; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.mTextView.setText(mDataset.get(position).getSubCategory_name()); } @Override public int getItemCount() { return mDataset.size(); } }

我现在正在输出

如您所见,它在每个选项卡中都显示相同的结果维生素和矿物质".我希望使用不同的子类别而不是相同的子类别.

As you can see it shows same result "Vitamin & Minerals" in every tabs..i want different subcategories instead of same.

推荐答案

我看到您的代码有很多问题,但是让您的UI显示子类别是因为这是您的主要关注点.

I see a lot of problems with your code, but let's get your UI displaying the subcategories since that's your main concern.

将适配器中的getItem更改为此:

Change the getItem in your adapter to this:

@Override public Fragment getItem(int position) { ArrayList<SubcategoryModel> subcategories = filelist.get(position).getItems(); Log.v("adapter", "getitem" + String.valueOf(position)+subcategories.size()); return FirstFragment.create(position,subcategories); }

引起问题的原因:

What caused the problem:

让我们在您的活动中专注于ArrayList<SubcategoryModel> subct:

Let's focus on ArrayList<SubcategoryModel> subct in your activity:

首先,您的代码执行了以下操作:

First your code did this:

for(int i = 0; i < filelist.size(); i++){ ArrayList<SubcategoryModel> subct=filelist.get(i).getItems(); // for(int j=0;j<subct.size();j++) ... }

因此,在此循环结束时,在filelist中设置了filelist中最后一个类别的子类别.

So at the end of this loop subct is set the subcategories of the last category in filelist.

此后,您执行了另一个循环来加载选项卡,但是使用了在循环内部声明的另一个subct变量,并且对您活动的subct字段没有影响.

After that, you did another loop to load the tabs, but that used a different subct variable that was declared inside the loop, and that had no effect on the subct field of your activity.

然后,您创建了视图分页器和适配器.

Then you created your view pager and adapter.

在您的寻呼机适配器中,您有以下内容:

In your pager adapter you had this:

@Override public Fragment getItem(int position) { Log.v("adapter", "getitem" + String.valueOf(position)+subct.size()); return FirstFragment.create(position,subct); }

由于subct之前被设置为循环中最后一个类别的子类别,所以无论该片段位于什么位置(类别),每个创建的片段都将接收这些子类别.我所做的就是更改代码以回到filelist并为要创建的片段的位置获取正确的类别(和子类别).

Since subct was set to the last category's subcategories from the loop before, every single fragment created was receiving those subcategories, no matter what position (category) the fragment was for. All I did was change the code to go back to filelist and get the correct category (and subcategories) for the position of the fragment being created.

在编写代码时,您会考虑要执行的代码.但是,在运行代码并发现问题的时候,您必须忘记要执行的代码,然后假装自己是计算机并在脑海中运行代码.您想了解每行代码有什么作用.这样一来,发现问题就更容易了.

When you're writing code, you think about what you want the code to do. However, at the point where you run the code and discover you have a problem, you have to forget what you wanted the code to do, then pretend you're the computer and run the code in your head. You want to understand what effect every line of code is having. When you do it that way it's easier to find the problem.

更多推荐

Android中的ViewPager + RecyclerView问题

本文发布于:2023-10-08 08:44:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1472106.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Android   ViewPager   RecyclerView

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!