优雅的使用RecyclerView(在一个recyclerView里显示有不同子布局的界面,就是混合不同布局)

原文

一:为了使用RecyclerView,首先在build.gradle(Module:app)文件里:

加入:

dependencies {

    compile 'com.android.support:recyclerview-v7:24.0.0'
}
 
二:主要代码
package com.example.kirito.testrecyclerview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private DemoAdapter adpter;

    private int colors[] = {android.R.color.holo_blue_bright,android.R.color.black,android.R.color.holo_red_dark};
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        //必须设置layoutmanager,否则无法正常加载
        recyclerView.setLayoutManager(new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL,false));
        adpter = new DemoAdapter(this);
        recyclerView.setAdapter(adpter);
        initData();
    }

    private void initData() {
        List<Item> items = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            Item item = new Item();
            //产生1-3的随机数
            int type = (int) (Math.random() * 3 + 1);
            //Log.e(TAG, "initData: random---"+ (int) (Math.random() * 3 + 1));
            item.type = type;
            item.avaterColor = colors[type - 1];
            item.content = "content:" + i;
            item.contentColor = colors[type - 1];
            item.name = "name:" + i;
            items.add(item);
        }
        adpter.addList(items);
        //即使不要下面这句也能正常初始化recyclerview
        adpter.notifyDataSetChanged();
    }


}

package com.example.kirito.testrecyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by kirito on 2016.10.29.
 */

public abstract class TypeAbstarctViewHolder extends RecyclerView.ViewHolder {
    public TypeAbstarctViewHolder(View itemView) {
        super(itemView);
    }

    public abstract void bindHolder(Item item);
}

package com.example.kirito.testrecyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by kirito on 2016.10.29.
 */

public class TypeOneHolder extends TypeAbstarctViewHolder {
    private ImageView avater;
    private TextView name;

    public TypeOneHolder(View itemView) {
        super(itemView);
        avater = (ImageView) itemView.findViewById(R.id.avater);
        name = (TextView) itemView.findViewById(R.id.name);
    }

    //为ViewHolder绑定数据
    @Override
    public void bindHolder(Item item) {
        avater.setBackgroundResource(item.avaterColor);
        name.setText(item.name);
    }
}

package com.example.kirito.testrecyclerview;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by kirito on 2016.10.29.
 */

public class TypeTwoHolder extends TypeAbstarctViewHolder {
    private ImageView avater;
    private TextView name;
    private TextView content;

    public TypeTwoHolder(View itemView) {
        super(itemView);
        avater = (ImageView) itemView.findViewById(R.id.avater);
        name = (TextView) itemView.findViewById(R.id.name);
        content = (TextView) itemView.findViewById(R.id.content);
    }

    @Override
    public void bindHolder(Item item) {
        avater.setBackgroundResource(item.avaterColor);
        name.setText(item.name);
        content.setText(item.content);
    }
}

package com.example.kirito.testrecyclerview;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by kirito on 2016.10.29.
 */

public class TypeThreeHolder extends TypeAbstarctViewHolder {
    private ImageView avater;
    private TextView name;
    private TextView content;
    private ImageView iv;

    public TypeThreeHolder(View itemView) {
        super(itemView);
        avater = (ImageView) itemView.findViewById(R.id.avater);
        name = (TextView) itemView.findViewById(R.id.name);
        content = (TextView) itemView.findViewById(R.id.content);
        iv = (ImageView) itemView.findViewById(R.id.content_color);
    }

    @Override
    public void bindHolder(Item item) {
        avater.setBackgroundResource(item.avaterColor);
        name.setText(item.name);
        content.setText(item.content);
        iv.setBackgroundResource(item.contentColor);
    }
}

package com.example.kirito.testrecyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by kirito on 2016.10.29.
 */

public class DemoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<Item> itemList = new ArrayList<>();
    private LayoutInflater mLayoutInflater;

    public DemoAdapter(Context context) {
        mLayoutInflater = LayoutInflater.from(context);
    }

    //使用此方法从mainactivity获取数据,这样就不用从构造方法里传数据了
    public void addList(List<Item> items){
        itemList.addAll(items);
    }

    @Override
    public int getItemViewType(int position) {
        return itemList.get(position).type;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //根据不同的viewType,创建并返回相应的ViewHolder
        switch (viewType){
            case Item.TYPE_ONE:
                return new TypeOneHolder(mLayoutInflater.inflate(R.layout.item_type_one,parent,false));
            case Item.TYPE_TWO:
                return new TypeTwoHolder(mLayoutInflater.inflate(R.layout.item_type_two,parent,false));
            case Item.TYPE_THREE:
                return new TypeThreeHolder(mLayoutInflater.inflate(R.layout.item_type_three,parent,false));
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        //因为抽象出了TypeAbstarctViewHolder,所以这里可以减少代码量
        ((TypeAbstarctViewHolder)holder).bindHolder(itemList.get(position));
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }
}

package com.example.kirito.testrecyclerview;

/**
 * Created by kirito on 2016.10.29.
 */

public class Item {
    protected static final int TYPE_ONE = 1;
    protected static final int TYPE_TWO = 2;
    protected static final int TYPE_THREE = 3;

    protected int type;
    protected int avaterColor;
    protected int contentColor;
    protected String name;
    protected String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getContentColor() {
        return contentColor;
    }

    public void setContentColor(int contentColor) {
        this.contentColor = contentColor;
    }

    public int getAvaterColor() {
        return avaterColor;
    }

    public void setAvaterColor(int avaterColor) {
        this.avaterColor = avaterColor;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public static int getTypeThree() {
        return TYPE_THREE;
    }

    public static int getTypeTwo() {
        return TYPE_TWO;
    }

    public static int getTypeOne() {
        return TYPE_ONE;
    }
}

布局文件代码就省略了...
 
运行效果:

 
三:混合Grid布局
主要修改了MainActivity里的代码,如下
package com.example.kirito.testrecyclerview;

import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private DemoAdapter adpter;

    private int colors[] = {android.R.color.holo_blue_bright,android.R.color.black,android.R.color.holo_red_dark};
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        //gridlayoutmanager构造参数里的2,指的是一行有几列
        final GridLayoutManager manager = new GridLayoutManager(this,2);
        //必须设置layoutmanager,否则无法正常加载
        recyclerView.setLayoutManager(manager);
        adpter = new DemoAdapter(this);
        recyclerView.setAdapter(adpter);
        //设置占用的列数
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int type = recyclerView.getAdapter().getItemViewType(position);
                //若是TYPE_THREE,占用两列,否则占用一列
                if (type == Item.TYPE_THREE){
                    return manager.getSpanCount();
                }else {
                    return 1;
                }
            }
        });
        recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
                //给布局里的子view添加边距
                GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
                int spanSize = layoutParams.getSpanSize();
                int spanIndex = layoutParams.getSpanIndex();
                outRect.top = 20;
                if (spanSize != manager.getSpanCount()){
                    if (spanIndex == 0){
                        outRect.right = 10;
                    }else {
                        outRect.left = 10;
                    }
                }
            }
        });
        initData();
    }

    private void initData() {
        List<Item> items = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            Item item = new Item();
            //产生1-3的随机数
            int type = (int) (Math.random() * 3 + 1);
            //Log.e(TAG, "initData: random---"+ (int) (Math.random() * 3 + 1));
            item.type = type;
            item.avaterColor = colors[type - 1];
            item.content = "content:" + type;
            item.contentColor = colors[type - 1];
            item.name = "name:" + type;
            items.add(item);
        }
        adpter.addList(items);
        //即使不要下面这句也能正常初始化recyclerview
        adpter.notifyDataSetChanged();
    }


}

效果图:

完整的代码:github

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值