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配置封装的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

02-02 11:51
查看更多