在項目中要求實現在gridview的布局效果上添加title,並且是多個在不同地方的title,每個title占據一整行,下面分享一下如何實現
先上效果圖:
1.首先添加title到list集合中:List ls;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rl = (RecyclerView) findViewById(R.id.myrv);
final GridLayoutManager manager = new GridLayoutManager(this,2);
rl.setLayoutManager(manager);
ls = new ArrayList<>();
for(int i = 0 ; i< 100 ; i ++){
ls.add(i + "");
}
MyAdapter myAdapter = new MyAdapter();
myAdapter.addTitle(7,"呵呵噠");
myAdapter.addTitle(11,"萌萌噠");
myAdapter.addTitle(20,"餓餓噠");
rl.setAdapter(myAdapter);
}
2.在recyclerview復寫的oncreateviewholder判斷類型,是否是title,是的話就創建title的自定義viewpublic SparseArray titles = new SparseArray<>();
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(isTitle(viewType)){
View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_title,parent,false);
TitleViewHolder titleViewHolder = new TitleViewHolder(v);
return titleViewHolder;
}else{
View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_test,parent,false);
MyViewHolder myViewHolder = new MyViewHolder(v);
return myViewHolder;
}
}
3.復寫adapter中的getviewtype方法@Override
public int getItemViewType(int position) {
if(isTitle(position)){
return position;
}
return super.getItemViewType(position);
}
4.復寫onbindviewholder,對不同類型的view進行綁定數據操作@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) {
if(isTitle(position)){
TitleViewHolder titleViewHolder = (TitleViewHolder) holder;
titleViewHolder.tv.setText(titles.get(position));
return;
}
//獲取空過去的item(關鍵)
for(int i = 0; i < titles.size(); i++){
int key = titles.keyAt(i);
if(position > titles.keyAt(titles.size() - 1)){
position -= titles.size();
break;
}else if(position > key && position < titles.keyAt(i + 1)){
position -= (i+1);
break;
}
}
final int s = position;
MyViewHolder myViewHolder = (MyViewHolder) holder;
myViewHolder.tv.setText(ls.get(s));
myViewHolder.tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您點擊了" + s,Toast.LENGTH_SHORT).show();
}
});
}
5.復寫getitemcount方法重新負值item數量public int getItemCount() {
return (ls.size() + titles.size());
}
6.添加兩個方法用於判斷是否是title,和添加title方法public boolean isTitle(int position){
return titles.get(position) == null ? false:true;
}
public void addTitle(int position,String title){
titles.put(position,title);
}
7.重點,對title類型進行分配兩個單元格處理@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
//如果是title就占據2個單元格(重點)
GridLayoutManager manager = (GridLayoutManager) recyclerView.getLayoutManager();
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if(isTitle(position)){
return 2;
}
return 1;
}
});
}
到此為止就完成了一個可以任意添加title的recyclerview