Android中的ViewPager + RecyclerView问题

嗨,我有Tablayout Viewpager和我使用Fragment tablayout。 现在在每个Tablayout片段中,我有Recyclerview和显示items.Please看到这个我的JSON响应

http://pastebin.com/nUswad9s

这里在“typeMaster”:数组我有types“typeName”:“狗”,我在tablayout中显示typenames我有4 tablayout和内部typemaster我有子分类命名为“catMaster”:我试图显示catmaster数据recyclerview,但问题是在每个片段它显示最后的数据“catName”:“维生素与矿物质”,

活动

 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

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

输出我现在正在得到

在这里输入图像描述

在这里输入图像描述

在这里输入图像描述

正如你可以看到它显示相同的结果“维生素和矿物质”在每个标签..我想要不同的子类别,而不是相同的。

我发现你的代码有很多问题,但让我们让你的UI显示子类别,因为这是你的主要关注点。

将适配器中的getItem更改为:

  @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); } 

是什么导致了问题:

让我们把注意力放在你的活动中的ArrayList<SubcategoryModel> subct

首先你的代码是这样做的:

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

所以在这个循环结束时, subct设置filelist最后一个类别的子类别。

之后,你做了另一个循环来加载标签,但是使用了一个在循环中声明的不同的subctvariables,并且对你的活动的subct字段没有影响。

然后你创build了你的视图寻呼机和适配器。

在你的寻呼机适配器,你有这样的:

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

由于subct被设置为循环之前的最后一个类别的子类别,所以创build的每个片段都接收这些子类别,无论该片段用于什么位置(类别)。 我所做的只是更改代码返回到filelist并获得正在创build的片段的位置正确的类别(和子类别)。

当你编写代码的时候,你会想到你想要的代码。 但是,在运行代码并发现问题的地方,您必须忘记自己想要的代码,然后假装自己是电脑并运行代码。 你想知道每行代码有什么作用。 当你这样做的时候更容易find问题。

问题:

没有办法在一个Bundle传递一个Serializable ArrayList 。 看看这里的文档页面捆绑文档

解:

改变你的SubCategoryModel来实现Parcelable ,然后使用bundle.putParcelableArrayList(key, list)bundle.getParcelableArrayList(key)ArrayList传递给FragmentArgs并从Fragment获取它们

这是你的代码的主要逻辑我猜…试试吧,让我知道如果你需要更多的帮助,或者你觉得有帮助…

 private void parseJsonData() { try { listDogs.clear(); JSONArray jsonArray = new JSONArray(loadJSONFromAsset()); JSONObject firstJsonobject = jsonArray.optJSONObject(0); JSONArray itemListJsonArray = firstJsonobject.optJSONArray("itemList"); JSONObject secondJsonobject = itemListJsonArray.optJSONObject(0); JSONArray typeMasterArray = secondJsonobject.optJSONArray("typeMaster"); JSONObject thirdJsonobject = typeMasterArray.optJSONObject(0); JSONArray catMasterArray = thirdJsonobject.optJSONArray("catMaster"); for(int i=0; i<catMasterArray.length(); i++) { JSONObject jsonObject = catMasterArray.optJSONObject(i); ModelClass modelClass = new ModelClass(); modelClass.setTypeId(jsonObject.optString("catID")); modelClass.setTypeName(jsonObject.optString("catName")); listDogs.add(modelClass); } RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(getActivity(), listDogs); recyclerView.setAdapter(recyclerViewAdapter); } catch (JSONException e) { e.printStackTrace(); } } 

注意:为了parsing狗类的数据,我在variablesthirdJsonobject中传递了0的位置。 通过1猫和马2,你会发现你想要的输出

截图: 狗类

猫类

马类