android好看的item布局,Android 中RecyclerView多种item布局的写法(头布局+脚布局)

RecyclerView多个item布局的写法(头布局+脚布局)

上图

下载源码

Initial commit第一次提交的代码,为本文内容

以下的为主要代码,看注释即可,比较简单

MainActivity

含上拉加载更多

package com.anew.recyclerviewall;

import android.os.Bundle;

import android.os.Handler;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.DefaultItemAnimator;

import android.support.v7.widget.DividerItemDecoration;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.support.v7.widget.Toolbar;

import android.util.Log;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends AppCompatActivity {

private RecyclerView mRecyclerView;

private List mHeadList;

private List mBodyList;

private List mFootList;

private MyAdapter mAdapter;

private LinearLayoutManager mLayoutManager;

Handler mHandler = new Handler();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

mHeadList = new ArrayList<>();

for (int i = 0; i < 1; i++) {

mHeadList.add("head" + i);

}

mBodyList = new ArrayList<>();

for (int i = 'A'; i < 'L'; i++) {

mBodyList.add("" + (char) i);

}

mFootList = new ArrayList<>();

for (int i = 0; i < 1; i++) {

mFootList.add("foot" + i);

}

mRecyclerView = (RecyclerView) findViewById(R.id.rv);

// 使用默认的api绘制分割线

mRecyclerView.addItemDecoration

(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));

// 设置增加删除item的动画效果

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

// 瀑布流

// mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));

mLayoutManager = new LinearLayoutManager(this);

mRecyclerView.setLayoutManager(mLayoutManager);

mAdapter = new MyAdapter(this, mHeadList, mBodyList, mFootList);

mRecyclerView.setAdapter(mAdapter);

// 当目前的可见条目是所有数据的最后一个时,开始加载新的数据

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

@Override

public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

super.onScrolled(recyclerView, dx, dy);

int lastCompletelyVisibleItemPosition = mLayoutManager.findLastCompletelyVisibleItemPosition();

if (lastCompletelyVisibleItemPosition + 1 == mAdapter.getItemCount()) {

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

List mMoreList = new ArrayList<>();

for (int i = 0; i < 3; i++) {

mMoreList.add("more" + i);

}

mBodyList.addAll(mMoreList);

mAdapter.notifyItemInserted(mAdapter.getItemCount() - 2);

}

}, 1500);

Log.e("qqq", "到底了" + lastCompletelyVisibleItemPosition);

}

int firstCompletelyVisibleItemPosition = mLayoutManager.findFirstCompletelyVisibleItemPosition();

if (firstCompletelyVisibleItemPosition == 0&&dy<0) {

Log.e("eeeee", "开始刷新呀呀呀");

}

}

});

}

}

MyAdapter

对外部:头布局list、身体布局list、脚布局list,所有的list单独计数

内部:对position进行调整,这里需要耐心调整position

package com.anew.recyclerviewall;

import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

import android.widget.Toast;

import java.util.List;

/**

* Created by a on 2017/1/7.

*/

public class MyAdapter extends RecyclerView.Adapter {

private Context context;

private List mHeadList;

private List mBodyList;

private List mFootList;

private static final int HEAD_TYPE = 1;

private static final int BODY_TYPE = 2;

private static final int FOOT_TYPE = 3;

public MyAdapter(Context context, List headList, List bodyList, List footList) {

this.context = context;

this.mHeadList = headList;

this.mBodyList = bodyList;

this.mFootList = footList;

}

// ★ 1. 定义规则,什么情况,是哪一种ViewType

@Override

public int getItemViewType(int position) {

int viewType = -1;

if (position < getHeadCount()) {

viewType = HEAD_TYPE;

} else if (position > getHeadCount() + getBodyCount() - 1) {

//这里最后要减去1,慢慢地去数

viewType = FOOT_TYPE;

} else {

viewType = BODY_TYPE;

}

return viewType;

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

LayoutInflater inflater = LayoutInflater.from(context);

View view = null;

// ★ 2. 根据viewType来确定加载那个布局,返回哪一个ViewHolder

switch (viewType) {

case HEAD_TYPE:

view = inflater.inflate(R.layout.item_head, parent, false);

return new HeadHolder(view);

case BODY_TYPE:

view = inflater.inflate(R.layout.item_body, parent, false);

return new BodyHolder(view);

case FOOT_TYPE:

view = inflater.inflate(R.layout.item_foot, parent, false);

return new FootHolder(view);

}

return null;

}

@Override

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

// ★ 3. 根据holder是哪一个ViewHolder的实例,来确定操作哪一个布局的UI

if (holder instanceof HeadHolder) {

HeadHolder headHolder = (HeadHolder) holder;

headHolder.mTvHead.setText(mHeadList.get(position) + "");

headHolder.mTvHead.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

addData();

}

});

}

if (holder instanceof BodyHolder) {

final BodyHolder bodyHolder = (BodyHolder) holder;

bodyHolder.mTvBody.setText(mBodyList.get(position - getHeadCount()) + "");

bodyHolder.mTvBody.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

removeData(bodyHolder.getAdapterPosition());

}

});

}

if (holder instanceof FootHolder) {

final FootHolder footHolder = (FootHolder) holder;

footHolder.mTvFoot.setText(mFootList.get(position - getHeadCount() - getBodyCount()) + "");

footHolder.mTvFoot.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(context, footHolder.getAdapterPosition() + "",

Toast.LENGTH_SHORT).show();

}

});

}

}

@Override

public int getItemCount() {

return getHeadCount() + getBodyCount() + getFootCount();

}

private int getFootCount() {

return mFootList.size();

}

private int getBodyCount() {

return mBodyList.size();

}

private int getHeadCount() {

return mHeadList.size();

}

public void addData(int position) {

mBodyList.add(position, "Insert One");

// ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果

notifyItemInserted(position);

}

/**

* 增加bodyList条目

*/

public void addData() {

mBodyList.add("1");

mBodyList.add("2");

mBodyList.add("3");

// ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果

notifyItemRangeInserted(0, 3);

}

/**

* 删除bodyList条目

*/

public void removeData(int position) {

// 经测试疯狂点击删除条目,会产生负数,导致越界异常

if (!(position - getHeadCount() < 0)) {

// ★★★★ 防止角标越界异常,要减去头布局数量,总之去数数吧

mBodyList.remove(position - getHeadCount());

notifyItemRemoved(position);

}

}

/**

* 头布局Holder

*/

static class HeadHolder extends RecyclerView.ViewHolder {

private TextView mTvHead;

public HeadHolder(View itemView) {

super(itemView);

mTvHead = (TextView) itemView.findViewById(R.id.tv_head);

}

}

/**

* 身体布局Holder

*/

static class BodyHolder extends RecyclerView.ViewHolder {

private TextView mTvBody;

public BodyHolder(View itemView) {

super(itemView);

mTvBody = (TextView) itemView.findViewById(R.id.tv_body);

}

}

/**

* 脚布局Holder

*/

static class FootHolder extends RecyclerView.ViewHolder {

private TextView mTvFoot;

public FootHolder(View itemView) {

super(itemView);

mTvFoot = (TextView) itemView.findViewById(R.id.tv_foot);

}

}

}

item_body

item_head和item_foot类似就不粘贴了

android:id="@+id/ll"

android:layout_width="match_parent"

android:layout_height="40dp"

android:layout_marginRight="11px"

android:layout_marginBottom="11px"

android:background="@color/colorPrimary"

android:orientation="vertical">

android:id="@+id/tv_body"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:textSize="17sp"

android:layout_gravity="center"

android:text="Hello World!"/>

以上所述是小编给大家介绍的Android 中RecyclerView多种item布局的写法(头布局+脚布局),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值