在使用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{
private final int[] show;
private final List mValues1;
private final List mValues2;
public SimpleItemRecyclerViewAdapter(List items1,List 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() + "'";
}
}
}