Android RecycleView 分类和折叠显示

在使用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() + "'";
            }
        }
     }


你可能感兴趣的:(Android)