Android RecycleView添加head配置封装的实例

Android RecycleView添加head配置封装的实例

这个是把RecycleView的适配器给封装了,直接调用就可以了,还添加了可以添加head头部功能,很赞的,今天记下来,下次直接用

实例代码:

package com.wwl.android; 

import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup; 

import java.util.ArrayList; 

public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

  public static final int TYPE_HEADER = 0;
  public static final int TYPE_NORMAL = 1; 

  private ArrayList<T> mDatas = new ArrayList<>(); 

  private View mHeaderView; 

  private OnItemClickListener mListener; 

  public void setOnItemClickListener(OnItemClickListener li) {
    mListener = li;
  } 

  public void setHeaderView(View headerView) {
    mHeaderView = headerView;
    notifyItemInserted(0);
  } 

  public View getHeaderView() {
    return mHeaderView;
  } 

  public void addDatas(ArrayList<T> datas) {
    mDatas.addAll(datas);
    notifyDataSetChanged();
  } 

  @Override
  public int getItemViewType(int position) {
    if(mHeaderView == null) return TYPE_NORMAL;
    if(position == 0) return TYPE_HEADER;
    return TYPE_NORMAL;
  } 

  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
    if(mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView);
    return onCreate(parent, viewType);
  } 

  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    if(getItemViewType(position) == TYPE_HEADER) return; 

    final int pos = getRealPosition(viewHolder);
    final T data = mDatas.get(pos);
    onBind(viewHolder, pos, data); 

    if(mListener != null) {
      viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          mListener.onItemClick(pos, data);
        }
      });
    }
  } 

  @Override
  public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView); 

    RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
    if(manager instanceof GridLayoutManager) {
      final GridLayoutManager gridManager = ((GridLayoutManager) manager);
      gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
          return getItemViewType(position) == TYPE_HEADER
              ? gridManager.getSpanCount() : 1;
        }
      });
    }
  } 

  @Override
  public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
    if(lp != null
        && lp instanceof StaggeredGridLayoutManager.LayoutParams
        && holder.getLayoutPosition() == 0) {
      StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
      p.setFullSpan(true);
    }
  } 

  public int getRealPosition(RecyclerView.ViewHolder holder) {
    int position = holder.getLayoutPosition();
    return mHeaderView == null ? position : position - 1;
  } 

  @Override
  public int getItemCount() {
    return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
  } 

  public abstract RecyclerView.ViewHolder onCreate(ViewGroup parent, final int viewType);
  public abstract void onBind(RecyclerView.ViewHolder viewHolder, int RealPosition, T data); 

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

  public interface OnItemClickListener<T> {
    void onItemClick(int position, T data);
  }
}

然后在外面自己的适配器中直接继承就可以了

package com.wwl.android; 

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; 

/**
 * wwl
 */
public class MyAdapter extends BaseRecyclerAdapter<String> { 

  @Override
  public RecyclerView.ViewHolder onCreate(ViewGroup parent, int viewType) {
    View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
    return new MyHolder(layout);
  } 

  @Override
  public void onBind(RecyclerView.ViewHolder viewHolder, int RealPosition, String data) {
    if(viewHolder instanceof MyHolder) {
      ((MyHolder) viewHolder).text.setText(data);
    }
  } 

  class MyHolder extends BaseRecyclerAdapter.Holder {
    TextView text;
    public MyHolder(View itemView) {
      super(itemView);
      text = (TextView) itemView.findViewById(R.id.text);
    }
  }
}

然后在类中调用,

public class MainActivity extends AppCompatActivity { 

  private RecyclerView mRecyclerView;
  private RecyclerView.LayoutManager mLayoutManager;
  private MyAdapter mAdapter; 

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

    mRecyclerView = (RecyclerView) findViewById(R.id.list);
//    mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    mLayoutManager = new GridLayoutManager(this, 2);
//    mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.addItemDecoration(new GridItemDecoration(this, true)); 

    mAdapter = new MyAdapter();
    mRecyclerView.setAdapter(mAdapter);
    mAdapter.addDatas(generateData());
    setHeader(mRecyclerView);
    mAdapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener<String>() {
      @Override
      public void onItemClick(int position, String data) {
        Toast.makeText(MainActivity.this, position + "," + data, Toast.LENGTH_SHORT).show();
      }
    });
  } 

  private void setHeader(RecyclerView view) {
    View header = LayoutInflater.from(this).inflate(R.layout.header, view, false); 

    mAdapter.setHeaderView(header);
  } 

  private ArrayList<String> generateData() {
    ArrayList<String> data = new ArrayList<String>() {
      {
        for(int i=0;i<21;i++) add("数据" + i);
      }
    };
    return data;
  } 

}

这样就OK啦。

布局文件:

R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"> 

  <android.support.v7.widget.RecyclerView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /> 

</LinearLayout>

header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"> 

  <ImageView
    android:layout_gravity="center_horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher"/> 

</LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:padding="20dp"
  android:orientation="vertical"> 

  <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="数据"/> 

</RelativeLayout>

以上就是Android RecycleView添加head配置封装的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android RecycleView 实现左滑上下分层示例代码(自定义功能)

    由于项目原因,需要在很多地方需要左划删除,并在后期会在item中不定增加功能.网上很多左划删除的demo,但大多封装的不太彻底,所以就试着自己进行封装. 独立上下两层互补干扰,满足不同item的左划 底部功能项不定如(删除.收藏) 截图 独立Adapter的操作方式 思路: public RCommonSlideAdapter(Object object, List datas, int layoutId, Class clazz, SlideItemHolder handle) { 在onCr

  • Android 中RecycleView实现item的点击事件

    Android 中RecycleView实现item的点击事件 RecycleView现在已经越来越受到大家的重视,因为他既可以代替listView还可以代替GridView,但是RecycleView本身不不像ListView那样具有setOnItemClickListener,这个关于子item的点击,但是我们往往会用到RecycleView并且希望他的自孩子可以被点击,那么如何实现他的item的点击事件呢? 首先我们在RecyclerView.ViewHolder中的实现: public

  • Android使用RecycleView实现拖拽交换item位置

    本文实例为大家分享了RecycleView实现拖拽交换item位置的具体代码,供大家参考,具体内容如下 老规矩,先来一张效果图: 相比起ListView而言,RecycleView实现拖拽交换位置的效果要简单很多,因为通过SDK中的ItemTouchHelper工具类可以轻松的实现这种效果,并且一套代码支持所有布局方式;而ListView的话则需要通过生成View的缓存镜像设置到ImageView中,然后通过WindowManager来操作该ImageView,具体怎么实现这里就不展开讲解了.回

  • Android recycleView的应用和点击事件实例详解

    Android recycleView的应用和点击事件 效果图: 长按是删除: 下面代码: MainActivity 类 public class MainActivity extends AppCompatActivity { RecyclerView rv; List<String> mList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.on

  • android中RecycleView添加下滑到底部的监听示例

    我们的日常开发中经常用到下拉刷新,而网上评价最好的开源下拉刷新组件当然还是android-Ultra-Pull-To-Refresh此组件可以给任何的控件添加下拉刷新功能.当然也包括recycleview了. 可惜android-Ultra-Pull-To-Refresh只是提供了下拉刷新的功能,但是对于列表类的组件,我们日常开发中更多的会用到其上拉加载或者滑到底部自动加载的功能,当然目前来看用户更喜欢滑到底部自动加载的功能.就比如今天说的recycleview我们只能自己给其添加滑到底部加载更

  • Android RecycleView添加head配置封装的实例

    Android RecycleView添加head配置封装的实例 这个是把RecycleView的适配器给封装了,直接调用就可以了,还添加了可以添加head头部功能,很赞的,今天记下来,下次直接用 实例代码: package com.wwl.android; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.suppor

  • Android Intent封装的实例详解

    Android Intent封装的实例详解 什么是Intent: Intent是协调应用间.组件之间的通讯和交互.通过Intent你可以启动Activity.Service.Broadcasts.更可以跨程序调用第三方组件.例如:启动拨打电话界面.音乐播放等. 组件     启动 Activity startActicity() Service startService(),bindService( ) Broadcasts sendBroadcast() 使用Intent: 栗子:在一个Act

  • Android OKHTTP的单例和再封装的实例

    Android OKHTTP的单例和再封装的实例 /** * Created by zm on 16-2-1 * okhttp的再封装,对于2.x版本,3.x版本将原有对okhttpclient配置 * 改成了builder模式配 * 置,对于超时.代理.dns,okhttp已经做好了配置, * 若不需要特殊配置,可以跳过 */ public class OkHttpUtil { private static OkHttpClient singleton; //非常有必要,要不此类还是可以被ne

  • Android ListView里控件添加监听方法的实例详解

    Android ListView里控件添加监听方法的实例详解 关于ListView,算是android中比较常见的控件,在ListView我们通常需要一个模板,这个模板指的不是住模块,而是配置显示在ListView里面的东西,今天做项目的时候发现想要添加一个ImageView监听方法,发现崩了,也许是好久没有动ListView竟然忘了不能直接在主UI的xml文件里面调用其他xml文件的控件,哪怕ListView用的是这个xml文件. [错误示范]: 直接调用ImageView这个控件是ListV

  • python读取ini配置的类封装代码实例

    这篇文章主要介绍了python读取ini配置的类封装代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 此为基础封装,未考虑过多异常处理 类 # coding:utf-8 import configparser import os class IniCfg(): def __init__(self): self.conf = configparser.ConfigParser() self.cfgpath = '' def checkSec

  • 原生js封装添加class,删除class的实例

    一.添加class function addClass(ele,cName) { var arr = ele.className.split(' ').concat(cName.split(" ")); for(var i=0;i<arr.length;i++){ for(var k=arr.length-1;k>i;k--){ (arr[k]==="")&&arr.splice(k,1); (arr[i]===arr[k])&&

  • Android 动态添加view或item并获取数据的实例

    最近在做一项目,项目中用到了一个功能,要求是动态Item,而且是多个的情况下,不过仔细的分析了下,都大同小异,做起来也很简单,在这里我只抽取出来做了一demo,也只做了一个动态添加item,同时可以获取所有添加和编辑Item上的数据,先上图: 我们先来分析一下这个demo: 两个TextView和EditText,一个Button,一个星级评价RatingBar控件,布局完事- activity_dynamic的布局,有可能会添加多个,所以外面用ScrollView,因为我们是垂直方向添加,所以

  • Android RecyclerView添加头部和底部实例详解

    Android RecyclerView添加头部和底部实例详解 如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_p

  • Android 动态添加Fragment的实例代码

    1.fragment1布局及代码 布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width=&quo

  • android编程实现对话框的封装实例

    本文实例讲述了android编程实现对话框的封装.分享给大家供大家参考,具体如下: /** * 对话框 */ private static ProgressDialog mProgressDialog; /** * 默认的对话框 * 标题.内容.两个按钮 * @param context * @param title * @param content * @param btnOKStr 是空字符的话 该按钮不显示 (特别注意) * @param btnCancelStr 是空字符的话 该按钮不显

随机推荐