在使用recycleview的时候,外层最好是不要有scrollview,或者说是不能,不然会发生冲突。仔细想想recycleview的wrap_content 并不代表着根据内容自适应高度,它的高度应和屏幕高度保持一致,然后才能去重复利用view,所以你把recycleview撑开了的话,再使用scrollview去滚动,就失去了本身的意义。所以,实现一定是用1个recycleview去包裹住所有元素
总的来说,recycleview高度一定是固定的,所以你不能同时使用2个或多个recycleview在一个想要垂直滚动的布局里面,那么分类就成为了一件麻烦的事情。意味着不管你是哪一类,你都得在recycleview的直接子元素里,包括分类折叠按钮,所以说最开始我都懵逼了一下。毕竟正常思维都是把每一组放在一个容器里面,而现在我要把所有东西放在一起来加以区分。我在网上看到有个框架来做这件事情的,当时也真的是吓尿了。。。其实这种东西,你理清下思路,一步一步的从计算出发就好了
第一步就是考虑清楚,标签该怎么显示,什么时候显示。因为recycleview一切都是基于位置的,你在哪个位置该显示什么东西。所以如果我位置是0,那就显示第一个分类按钮,如果第一类是折叠的,那么第二个分类按钮就在位置1,如果我是展开的,那就是在第一类元素总数+2的位置上,以此类推。
第二步就是具体设计,我用一个数组来存放1-N个分类状态(展开或折叠),1-N个list来存放对应数据,那么根据这2个东西就完全可以计算出任何一个位置该显示什么东西了,也可以计算出要显示的总的元素的个数。viewtype的话就是你分类按钮个数+1,来区分每个按钮具体该显示什么,元素就是总的一类就行,是不是很简单?
在此附上我的adapter
public class SimpleItemRecyclerViewAdapter extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder>{ private final int[] show; private final List<DummyContent.DummyItem> mValues1; private final List<DummyContent.DummyItem> mValues2; public SimpleItemRecyclerViewAdapter(List<DummyContent.DummyItem> items1,List<DummyContent.DummyItem> items2) { mValues1 = items1; mValues2 = items2; show=new int[2]; show[0]=1; show[1]=1; } @Override public int getItemViewType(int position) { if(position==0){ return 0; } else { boolean isBtn2=false; if(show[0]==0&&position==1){ isBtn2=true; } else if(show[0]==1&&position==mValues1.size()+1){ isBtn2=true; } if(isBtn2){ return 1; } } return 2; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewHolder holder=null; if(viewType==0||viewType==1){ final Button btn=new Button(parent.getContext()); ViewGroup.LayoutParams p=new ViewGroup.LayoutParams(-1,200); btn.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); btn.setTextSize(18); btn.setLayoutParams(p); if(viewType==0){ btn.setText("▼ 在线"); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(btn.getText().equals("▼ 在线")){ btn.setText("► 在线"); show[0]=0; } else{ btn.setText("▼ 在线"); show[0]=1; } recyclerView.getAdapter().notifyDataSetChanged(); } }); } else{ btn.setText("▼ 离线"); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(btn.getText().equals("▼ 离线")){ btn.setText("► 离线"); show[1]=0; } else{ btn.setText("▼ 离线"); show[1]=1; } recyclerView.getAdapter().notifyDataSetChanged(); } }); } holder=new ViewHolder(btn,false); } else{ holder=new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_content,parent,false),true); RecyclerView.LayoutParams p=(RecyclerView.LayoutParams)holder.mView.getLayoutParams(); p.leftMargin=50; p.rightMargin=50; holder.mView.setLayoutParams(p); } return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { if(position==0||(show[0]==0&&position==1)||(show[0]==1&&position==mValues1.size()+1)){ return; } DummyContent.DummyItem item=null; if(show[0]==0){ if(show[1]==1){ item=mValues2.get(position-2); } } else{ if(position<=mValues1.size()){ item=mValues1.get(position-1); } else{ item=mValues2.get(position-2-mValues1.size()); } } if(item!=null) { holder.mItem = item; holder.mIdView.setText(item._sid.substring(0, 9)+"..."); holder.mTime.setText(Common.DateToString(item._time)); if(item._num>0){ holder.mNum.setText(String.valueOf(item._num)); } else{ holder.mNum.setText(""); } try { holder.mContentView.setText(item._msgList.getJSONObject(item._msgList.length() - 1).getString("Msg1")); } catch (JSONException e) { e.printStackTrace(); } final DummyContent.DummyItem finalItem = item; holder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mTwoPane) { Bundle arguments = new Bundle(); arguments.putString(ItemDetailFragment.ARG_ITEM_ID, finalItem._sid); ItemDetailFragment fragment = new ItemDetailFragment(); fragment.setArguments(arguments); getSupportFragmentManager().beginTransaction() .replace(R.id.item_detail_container, fragment) .commit(); } else { Context context = v.getContext(); Intent intent = new Intent(context, ItemDetailActivity.class); intent.putExtra(ItemDetailFragment.ARG_ITEM_ID, finalItem._sid); context.startActivity(intent); } } }); } } @Override public int getItemCount() { int count=2; if(show[0]==1){ count+=mValues1.size(); } if(show[1]==1){ count+=mValues2.size(); } return count; } public class ViewHolder extends RecyclerView.ViewHolder { public final View mView; public final TextView mIdView; public final TextView mContentView; public final TextView mNum; public final TextView mTime; public DummyContent.DummyItem mItem; public ViewHolder(View view,boolean find) { super(view); mView = view; if(find){ mIdView = (TextView) view.findViewById(R.id.id); mContentView = (TextView) view.findViewById(R.id.content); mNum = (TextView) view.findViewById(R.id.num); mTime = (TextView) view.findViewById(R.id.time); } else{ mIdView=null; mContentView=null; mNum=null; mTime=null; } } @Override public String toString() { return super.toString() + " '" + mContentView.getText() + "'"; } } }