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

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