软件编程
位置:首页>> 软件编程>> Android编程>> Android RecycleView添加head配置封装的实例

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

作者:龙哥IT  发布时间:2021-09-14 00:05:58 

标签: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>

来源:http://274137570-qq-com.iteye.com/blog/2373854

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com