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
最后一个类别的子类别。
之后,你做了另一个循环来加载标签,但是使用了一个在循环中声明的不同的subct
variables,并且对你的活动的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,你会发现你想要的输出
截图: 狗类
猫类
马类
- WebView,将本地.CSS文件添加到HTML页面?
- 禁用导航抽屉,切换家庭button/向上指示器的碎片
- 什么是“android.R.layout.simple_list_item_1”?
- 设置android应用程序的图标
- 如何在android中使用getSharedPreferences
- Android xml错误:使用RelativeLayout(@ id / LinearLayout_acc,@ id / ProgressBar_statusScreen)发现“找不到与给定名称匹配的资源”
- 如何使用Material Design App的自定义颜色创build自定义调色板?
- 如果启用了硬件加速,WebView会以白色背景“闪烁”(Android 3.0+)
- 如何在Android中dynamic添加TextView到LinearLayout?