首先上效果图:二种不同的管理器
以上的状态示意图:我们可以将头部和身体部分以及尾部部分看成三种不同的Type类型
代码如下:注释很清晰
第一步:窗口代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//设置listView管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//设置垂直方向
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);
//Grid表格布局
/*GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
mRecyclerView.setLayoutManager(gridLayoutManager);*/
// 同时在adapter中必须去实现onAttachedToRecyclerView
//设置其Adapter
ProductAdapter productAdapter = new ProductAdapter(this);
mRecyclerView.setAdapter(productAdapter);
}
第二步:适配器中代码如下:
public class ProductAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
public ProductAdapter(Context context) {
this.mContext = context;
}
//设置三种不同Item类型,分别是头部,item,尾部
public static final int ITME_TYPE_HEADER = 1;
public static final int ITME_TYPE_CONTENT = 2;
public static final int ITME_TYPE_BOTTOM = 3;
//模拟填充假数据
public String[] texts = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "P"};
//设置默认头部和底部数据只有一个
private int mHeadCount = 1;
private int mButtomCount = 1;
//获得内容的长度
public int getContentItemCount() {
return texts.length;
}
//根据不同类型的viewType,创建不同的ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case ITME_TYPE_HEADER:
View view = LayoutInflater.from(mContext).inflate(R.layout.head_recycler_adapter, parent, false);
return new HeadViewHolder(view);
case ITME_TYPE_CONTENT:
View view2 = LayoutInflater.from(mContext).inflate(R.layout.content_recycler_adapter, parent, false);
return new ContentViewHolder(view2);
case ITME_TYPE_BOTTOM:
View view1 = LayoutInflater.from(mContext).inflate(R.layout.buttom_recycler_adapter, parent, false);
return new ButtomViewHolder(view1);
}
return null;
}
//头部ViewHolder
public static class HeadViewHolder extends RecyclerView.ViewHolder {
HeadViewHolder(View itemView) {
super(itemView);
}
}
//尾部ViewHodler
public static class ButtomViewHolder extends RecyclerView.ViewHolder {
ButtomViewHolder(View itemView) {
super(itemView);
}
}
//内容ViewHodler
public static class ContentViewHolder extends RecyclerView.ViewHolder {
private TextView tv_item_text;
ContentViewHolder(View itemView) {
super(itemView);
tv_item_text = (TextView) itemView.findViewById(R.id.tv_item_text);
}
}
//绑定数据
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//hodler来区别绑定不同的数据
if (holder instanceof HeadViewHolder) {
//具体的控件填充参数处理机其他如点击事件
} else if (holder instanceof ContentViewHolder) {
//索引position必须要减去其头部的个数
((ContentViewHolder) holder).tv_item_text.setText(texts[position - mHeadCount]);
} else if (holder instanceof ButtomViewHolder) {
//具体的控件填充参数处理机其他如点击事件
}
}
//返回总的视图个数
@Override
public int getItemCount() {
return mHeadCount + mButtomCount +getContentItemCount();
}
//分别返回三种不同类型的TYPE
@Override
public int getItemViewType(int position) {
int dataItemCount = getContentItemCount();
if (mHeadCount != 0 && position < mHeadCount) {
return ITME_TYPE_HEADER;
} else if (mButtomCount != 0 && position >= (dataItemCount + mHeadCount)) {
return ITME_TYPE_BOTTOM;
} else {
return ITME_TYPE_CONTENT;
}
}
//当如果是Grid布局的时候需要去实现
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if(layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return getItemViewType(position) == ITME_TYPE_HEADER || getItemViewType(position) == ITME_TYPE_BOTTOM ? gridLayoutManager.getSpanCount():1;
}
});
}
}
}
第三步:简单的贴出使用CardView的代码–即content_recycler_adapter
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cv_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardBackgroundColor="#d7070b"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="4dp">
<TextView
android:layout_gravity="center_horizontal"
android:id="@+id/tv_item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:text="test"/>
</android.support.v7.widget.CardView>
以上:即可实现
下面实现recyclerView内item中存在多个子控件的点击事件
第一步:在adapte内定义接口,及多个点击方法和对外暴露的方法
private recycViewItemClick mItemInnerClickListener;
//对外暴露方法
public void setOnItemDeleteClickListener(recycViewItemClick mItemInnerClickListener) {
this.mItemInnerClickListener = mItemInnerClickListener;
}
//定义接口及内的方法
public interface recycViewItemClick{
public void ClickImageButtonDel(URLBean urlBean);
public void ClickTextGetURl(String URL);
}
第二步:分别实现子控件的点击方法
@Override
public void onBindViewHolder(AddreddHodler holder, int position) {
final URLBean urlBean = urlBeans.get(position);
final String url = urlBean.url;
if(!TextUtils.isEmpty(url)) {
holder.mSavaAddressUrl.setText(url);
}
holder.mDeleteAddressUrl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
urlBeans.remove(urlBean);
mItemInnerClickListener.ClickImageButtonDel(urlBean);
}
});
holder.mSavaAddressUrl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mItemInnerClickListener.ClickTextGetURl(url);
}
});
}
第三步:在外调用暴露在外的接口方法
mAddressAdapter.setOnItemDeleteClickListener(this);
@Override
public void ClickImageButtonDel(URLBean urlBean) {
URLDao.deleteURL(urlBean);
mAddressAdapter.notifyDataSetChanged();
}
@Override
public void ClickTextGetURl(String URL) {
mInputUrl.setText(URL);
mPopupWindow.dismiss();
}
以上,即可
手机扫一扫
移动阅读更方便
你可能感兴趣的文章