手把手教你給RecycleView添加頭布局和尾布局


  RecycleView想必大家都不陌生,它已他的高拓展性取代了傳統布局顯示,同時配合協調布局,可以實現很多意想不到的酷炫交互,今天就和大家介紹一下,如何給RecycleView添加頭布局和尾布局,同時你也可以通過自己的拓展實現更多復雜的布局。

首先我們先看一下效果:

 

實現頭部尾部布局其實方法還是很多,這里我推薦使用Adapter設置itemType來做,那么問題來了,為什么這么做呢?因為拓展性更強,並且更加解耦。將邏輯都寫在adapter中,比起寫在activity中管理起來也更加方便。

首先,我們需要明確一點,什么是head,什么是foot,當位於第一個item的時候就是head,最后一個就是foot.之后我們根據不同的itemType加載出來就可以了。

第一步判斷頭尾部以及內容區域:

private int getBodySize() {
        return listData.size();
    }
    private boolean isHead(int position) {
        return headCount!=0&&position<headCount;
    }
    private boolean isFoot(int position) {
        return footCount!=0&&(position>=(getBodySize()+headCount));
    }
    public int getItemViewType(int position) {
        if (isHead(position)) {
            return HEAD_TYPE;
        }else if (isFoot(position)) {
            return FOOT_TYPE;
        }else {
            return BODY_TYPE;
        }
    }

根據不同的ViewType生產不同的Holder

@Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case HEAD_TYPE:
                return new HeadViewHolder(mLayoutInflater.inflate(R.layout.trend_head,parent,false));
            case BODY_TYPE:
                return new BodyViewHolder(mLayoutInflater.inflate(R.layout.itemview_trend,parent,false));
            case FOOT_TYPE:
                return new FootViewHolder(mLayoutInflater.inflate(R.layout.trend_bottom,parent,false));
            default:
                return null;
        }


    }

拿到不同的holder生產具體實現:

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof HeadViewHolder) {

        }else if (holder instanceof BodyViewHolder) {
            ((BodyViewHolder) holder).body.setText((CharSequence) listData.get(position-headCount));

        }else if (holder instanceof FootViewHolder) {

        }

    }

怎么樣是不是很簡單?其實還可以拓展實現更多樣式的item只需要我們設置itemtype和位置就可以了。最后附上完整代碼。

public class HBRecycleViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private static final int HEAD_TYPE=00001;
    private static final int BODY_TYPE=00002;
    private static final int FOOT_TYPE=00003;
    private int headCount=1;//頭部個數,后續可以自己拓展
    private int footCount=1;//尾部個數,后續可以自己拓展
    private LayoutInflater mLayoutInflater;
    private List<T>listData=new ArrayList<>();
    public HBRecycleViewAdapter(Context context,List<T>listData) {
        //this.context=context;
        mLayoutInflater=LayoutInflater.from(context);
        this.listData=listData;
    }
    private int getBodySize() {
        return listData.size();
    }
    private boolean isHead(int position) {
        return headCount!=0&&position<headCount;
    }
    private boolean isFoot(int position) {
        return footCount!=0&&(position>=(getBodySize()+headCount));
    }
    @Override
    public int getItemViewType(int position) {
        if (isHead(position)) {
            return HEAD_TYPE;
        }else if (isFoot(position)) {
            return FOOT_TYPE;
        }else {
            return BODY_TYPE;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case HEAD_TYPE:
                return new HeadViewHolder(mLayoutInflater.inflate(R.layout.trend_head,parent,false));
            case BODY_TYPE:
                return new BodyViewHolder(mLayoutInflater.inflate(R.layout.itemview_trend,parent,false));
            case FOOT_TYPE:
                return new FootViewHolder(mLayoutInflater.inflate(R.layout.trend_bottom,parent,false));
            default:
                return null;
        }


    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof HeadViewHolder) {

        }else if (holder instanceof BodyViewHolder) {
            ((BodyViewHolder) holder).body.setText((CharSequence) listData.get(position-headCount));

        }else if (holder instanceof FootViewHolder) {

        }

    }

    @Override
    public int getItemCount() {
        return headCount+getBodySize()+footCount;
    }
    private static class HeadViewHolder extends RecyclerView.ViewHolder{

        public HeadViewHolder(View itemView) {
            super(itemView);
        }
    }
    private static class BodyViewHolder extends RecyclerView.ViewHolder{
        TextView body;
        public BodyViewHolder(View itemView) {
            super(itemView);
            body= (TextView) itemView.findViewById(R.id.tv_body);
        }
    }
    private static class FootViewHolder extends RecyclerView.ViewHolder {

        public FootViewHolder(View itemView) {
            super(itemView);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM