两个listview(RecyclerView)联动上下展示不全问题解析

我们在项目中会遇到这种情况:(两个列表的数据对象不一样,样式排版不一样)放在一个界面,分为上下的排列方式。首先会想到用两个listview上线排列显示。但是你会发现当第一个listview超过一屏幕的话,下面那个将无法显示。介绍一下常用的两种方法
一、LinearListView
用 LinearLayout 实现的 ListView,可解决多个 ListView 并存等问题。用起来很简单
a: compile ‘com.github.frankiesardo:linearlistview:1.0.1@aar’
(如下)
两个listview(RecyclerView)联动上下展示不全问题解析_第1张图片

二、思路:复合是Adapter(只是放入一个lsitview。在自定义adpter的时候出入两个list集合。分为上下两个list.关键是在如何去显示问题)直接上代码

public class OrgUserAdapterNew extends BaseAdapter {
    private List groupList;
    private List childPersonList;
    private Context mContext;
    private final int TOP_ITEM = 0, BOTTOM_ITEM = 1, TYPE_COUNT = 2;
    private ImageOptions imageOptions;
    /**
     * 头部列表数据的大小
     */
    private int TopCount = 0;


    public OrgUserAdapterNew(Context mContext, List groupList,
                             List childPersonList) {
        this.mContext = mContext;
        this.groupList = groupList;
        this.childPersonList = childPersonList;
        TopCount = groupList.size();
        imageOptions = new ImageOptions.Builder()
                .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
//            .setRadius(DensityUtil.dip2px(radius))
                .setIgnoreGif(false)
                .setCrop(true)//是否对图片进行裁剪
                .setFailureDrawableId(R.drawable.placeholder)
                .setLoadingDrawableId(R.drawable.sidebar001)
                .build();
    }

    /**
     * 设置Item显示的数据集合
     *
     * @param groupList
     */
    public void setTopList(List groupList) {
        this.groupList = groupList;
        TopCount = groupList.size();
        notifyDataSetChanged();
    }

    /**
     * 设置Item显示的数据集合
     *
     * @param childPersonList
     */
    public void setBottomList(List childPersonList) {
        this.childPersonList = childPersonList;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        int count = 0;
        if (groupList != null && childPersonList != null) {
            count = TopCount + childPersonList.size();
        }
        if (groupList != null && childPersonList == null) {
            count = TopCount;
        }
        if (groupList != null && childPersonList == null) {
            count = childPersonList.size();
        }
        return count;
    }

    @Override
    public Object getItem(int position) {
        if (position >= 0 && position < TopCount) {
            return groupList.get(position);
        }

        if (position > TopCount) {
            return childPersonList.get(position - TopCount);
        }
        if (position <= 1) {
            return null;
        }
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 该方法返回多少个不同的布局
     */
    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return TYPE_COUNT;
    }

    /**
     * 获取当前需要显示布局的类型
     * return TOP_ITEM则表示上面半部分列表
     * return BOTTOM_ITEM则表示下半部分列表
     **/
    @Override
    public int getItemViewType(int position) {

        if (position < TopCount)
            return TOP_ITEM;
        else
            return BOTTOM_ITEM;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolderTop viewHolderTop = null;
        ViewHolderBottom viewHolderBottom = null;
        if (convertView == null) {
            if (getItemViewType(position) == TOP_ITEM) {
                viewHolderTop = new ViewHolderTop();
                convertView = LayoutInflater.from(mContext).inflate(
                        R.layout.workgroup_item, null);
                viewHolderTop.tvGroupname= (TextView) convertView.findViewById(R.id.tv_groupname);
                convertView.setTag(viewHolderTop);
            } else {
                viewHolderBottom = new ViewHolderBottom();
                convertView = LayoutInflater.from(mContext).inflate(
                        R.layout.newmodule_selectmember_item, null);
                viewHolderBottom.itemName= (TextView) convertView.findViewById(R.id.item_name);
                viewHolderBottom.ivImgtouxiang= (CircleImageView) convertView.findViewById(R.id.iv_imgtouxiang);
                viewHolderBottom.itemPostion= (TextView) convertView.findViewById(R.id.item_postion);
                convertView.setTag(viewHolderBottom);
            }

        } else {
            if (getItemViewType(position) == TOP_ITEM) {
                viewHolderTop = (ViewHolderTop) convertView.getTag();
            } else {
                viewHolderBottom = (ViewHolderBottom) convertView.getTag();
            }
        }

        if (position < TopCount) {
            viewHolderTop.tvGroupname.setText(groupList.get(position).getName());
        } else {
            viewHolderBottom.itemName.setText(childPersonList.get(position-TopCount).getName());
            viewHolderBottom.itemPostion.setText(childPersonList.get(position-TopCount).getOrg());
            if (!TextUtils.isEmpty(childPersonList.get(position-TopCount).getHeadimages())) {
                x.image().bind(viewHolderBottom.ivImgtouxiang, RequestUtils.getImages(childPersonList.get(position-TopCount).getHeadimages()).get(0), imageOptions);
            }

        }

        return convertView;

    }

    static class ViewHolderBottom {
//        @BindView(R.id.iv_imgtouxiang)
        CircleImageView ivImgtouxiang;
//        @BindView(R.id.item_name)
        TextView itemName;
//        @BindView(R.id.item_postion)
        TextView itemPostion;

//        ViewHolderBottom(View view) {
//            ButterKnife.bind(this, view);
//        }
    }

    static class ViewHolderTop {
//        @BindView(R.id.tv_groupname)
        TextView tvGroupname;
//
//        ViewHolderTop(View view) {
//            ButterKnife.bind(this, view);
//        }
    }

}

注意:在listView的adapter中使用多个ViewHoler时每一个ViewHolder的id不能用ButterKnife生成要手动去findViewById,这是因为adapter无法区分viewholder对应的布局文件会提示空指针。(但是在RecyclerView中可以)

你可能感兴趣的:(Android)