导包:
implementation 'com.android.support:recyclerview-v7:28.0.0'
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/contonts"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
标题的xml:
title.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="8dp"
android:paddingBottom="16dp"
android:text="标题"
android:textSize="18sp"
/>
选中的频道xml:
zhong.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="频道名称"
android:gravity="center"
android:background="#ff6699"
/>
</FrameLayout>
未选中xml:
wei.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="频道名称"
android:gravity="center"
android:background="#cccfff"
/>
</FrameLayout>
Bean类:
package guopuran.bwie.com.pindao;
public class Bean {
//名称
private String name;
//是否选择的频道
private boolean isSelected;
//是否当前频道
private boolean isCurrent;
//是否固定不能更改的
private boolean isFixted;
public Bean(String name, boolean isSelected, boolean isCurrent) {
this.name = name;
this.isSelected = isSelected;
this.isCurrent = isCurrent;
}
public String getName() {
return name;
}
public boolean isSelected() {
return isSelected;
}
public boolean isCurrent() {
return isCurrent;
}
public boolean isFixted() {
return isFixted;
}
public void setName(String name) {
this.name = name;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
public void setCurrent(boolean current) {
isCurrent = current;
}
public void setFixted(boolean fixted) {
isFixted = fixted;
}
}
适配器:
ContentsAdapter:
package guopuran.bwie.com.pindao;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class ContentsAdapter extends RecyclerView.Adapter<ContentsAdapter.ViewHolder> {
private List<Bean> wei;
private List<Bean> zhong;
private Context context;
public ContentsAdapter(Context context) {
this.context = context;
//初始化
wei=new ArrayList<>();
zhong=new ArrayList<>();
}
//输入
public void setlist(List<Bean> wei,List<Bean> zhong) {
this.wei = wei;
this.zhong = zhong;
//刷新适配器
notifyDataSetChanged();
}
//当前position是否是选中的频道item
public boolean iszhong(int position){
return position<=zhong.size();
}
//当前position是否是标题
public boolean isTitle(int position){
return isweiTitle(position)||iszhongTitle(position);
}
//是否是选中的频道标题
public boolean iszhongTitle(int position){
return position==0;
}
//是否是普通的标题
public boolean isweiTitle(int position){
return position==zhong.size()+1;
}
public Bean getItem(int position){
if (isTitle(position)){
return null;
}
if (iszhong(position)){
return zhong.get(position-1);
}
return wei.get(position-zhong.size()-2);
}
//判断条目类型
@Override
public int getItemViewType(int position) {
if (isTitle(position)){
return R.layout.title;
}else if (iszhong(position)){
return R.layout.zhong;
}
return R.layout.wei;
}
//RecyclerView已经帮我们做好了复用
//当没有复用的view,会调用这个方法。我们创建出ViewHolder
//否则直接复用ViewHolder
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if (i==R.layout.title){
return new ViewHolder(LayoutInflater.from(context).inflate(i,viewGroup,false));
}else{
return new ViewHolder(LayoutInflater.from(context).inflate(i,viewGroup,false),listener);
}
}
//更新需要展示的View。即在这里做数据绑定
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
if (iszhongTitle(i)){
viewHolder.text.setText("我的频道");
return ;
}else if (isweiTitle(i)){
viewHolder.text.setText("频道管理");
return;
}
viewHolder.text.setText(getItem(i).getName());
}
//需要展示多少条目
@Override
public int getItemCount() {
//多两个标题
return zhong.size()+wei.size()+2;
}
private OnItemClickListener listener;
public ContentsAdapter setOnItemClickListener(OnItemClickListener listener){
this.listener=listener;
return this;
}
//删除
public Bean removeItem(int position){
Bean bean=null;
if (iszhong(position)){
bean=zhong.remove(position-1);
}else{
bean=wei.remove(position-zhong.size()-2);
}
//通知
//选中-1
//未选中 -zhong.size()-2
notifyItemRemoved(position);
return bean;
}
public void addItem(Bean bean){
if (bean.isSelected()){
zhong.add(bean);
notifyItemInserted(zhong.size());
}else{
wei.add(0,bean);
notifyItemInserted(zhong.size()+2);
}
}
//接口回调
public interface OnItemClickListener{
void OnItemClick(View itemView,int position);
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView text;
public ViewHolder(View itemView){
super(itemView);
text=itemView.findViewById(R.id.text);
}
public ViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
this(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener==null){
return;
}
listener.OnItemClick(ViewHolder.this.itemView,getAdapterPosition());
}
});
}
}
}
MainActivity:
package guopuran.bwie.com.pindao;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView contonts;
private ContentsAdapter contentsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取资源ID
contonts = findViewById(R.id.contonts);
//优化
contonts.setHasFixedSize(true);
//设置适配器
contentsAdapter = new ContentsAdapter(this);
//布局管理器
GridLayoutManager layoutManager=new GridLayoutManager(this,4);
//item如何跨列显示
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
return contentsAdapter.isTitle(i)?4:1;
}
});
//布局
contonts.setLayoutManager(layoutManager);
contonts.setAdapter(contentsAdapter);
contentsAdapter.setOnItemClickListener(new ContentsAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View itemView, int position) {
//移除
Bean bean=contentsAdapter.removeItem(position);
bean.setSelected(!bean.isSelected());
//添加
contentsAdapter.addItem(bean);
}
});
initData();
}
private void initData() {
List<Bean> zhong=new ArrayList<>();
List<Bean> wei=new ArrayList<>();
zhong.add(new Bean("关注1",true,false));
zhong.add(new Bean("关注2",true,false));
zhong.add(new Bean("关注3",true,false));
zhong.add(new Bean("关注4",true,false));
zhong.add(new Bean("关注5",true,false));
zhong.add(new Bean("关注6",true,false));
zhong.add(new Bean("关注7",true,false));
zhong.add(new Bean("关注8",true,false));
wei.add(new Bean("关注9",false,false));
wei.add(new Bean("关注10",false,false));
wei.add(new Bean("关注11",false,false));
wei.add(new Bean("关注12",false,false));
wei.add(new Bean("关注13",false,false));
wei.add(new Bean("关注14",false,false));
wei.add(new Bean("关注15",false,false));
wei.add(new Bean("关注16",false,false));
wei.add(new Bean("关注17",false,false));
wei.add(new Bean("关注18",false,false));
contentsAdapter.setlist(wei,zhong);
}
}