1.MainActivity页面
package com.example.recycleview01.ui.activity;
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.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.example.recycleview01.Bean.ChannelBean;
import com.example.recycleview01.R;
import com.example.recycleview01.ui.adaper.RecycleAdaper;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecycleAdaper adaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取资源id
recyclerView = findViewById(R.id.recyele);
//优化
recyclerView.setHasFixedSize(true);
//创建适配器
adaper = new RecycleAdaper(this);
//布局管理器
GridLayoutManager layoutManager = new GridLayoutManager(this,4);
//item如何款列显示
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
//是标题就要跨4列
return adaper.isTitle(i)?4:1;
}
});
//将频道管理器设置给recycleview
recyclerView.setLayoutManager(layoutManager);
adaper.setOnItemCllickListener(new RecycleAdaper.OnItemCllickListener() {
@Override
public void onItemClick(View itemView, int position) {
if(position<0){
return;
}
/*if (!isEditMode && adaper.isSelectChannel(position)) {
Toast.makeText(MainActivity.this, "选中了条目, 返回: " + position, Toast.LENGTH_SHORT).show();
return;
}*/
//移除
ChannelBean removeBean = adaper.removeItem(position);
removeBean.setSelect(!removeBean.isSelect());
//添加
adaper.addItem(removeBean);
}
});
//设置适配器
recyclerView.setAdapter(adaper);
initData();
}
private void initData() {
//我的频道数据
List<ChannelBean> selectDatas = new ArrayList<>();
selectDatas.add(new ChannelBean("关注",true,false));
selectDatas.add(new ChannelBean("推荐",true,false));
selectDatas.add(new ChannelBean("科技",true,false));
selectDatas.add(new ChannelBean("美食",true,false));
selectDatas.add(new ChannelBean("养生",true,false));
selectDatas.add(new ChannelBean("电影",true,false));
selectDatas.add(new ChannelBean("生活",true,false));
selectDatas.add(new ChannelBean("搞笑",true,false));
selectDatas.add(new ChannelBean("懂车帝",true,false));
selectDatas.add(new ChannelBean("军事",true,false));
selectDatas.add(new ChannelBean("党媒推荐",true,false));
selectDatas.add(new ChannelBean("历史",true,false));
selectDatas.add(new ChannelBean("体育",true,false));
//频道推荐数据
List<ChannelBean> normalDatas = new ArrayList<>();
normalDatas.add(new ChannelBean("宠物",false,false));
normalDatas.add(new ChannelBean("娱乐",false,false));
normalDatas.add(new ChannelBean("财经",false,false));
normalDatas.add(new ChannelBean("直播",false,false));
normalDatas.add(new ChannelBean("特卖",false,false));
normalDatas.add(new ChannelBean("房产",false,false));
normalDatas.add(new ChannelBean("精品课",false,false));
normalDatas.add(new ChannelBean("小说",false,false));
normalDatas.add(new ChannelBean("时尚",false,false));
normalDatas.add(new ChannelBean("音频",false,false));
normalDatas.add(new ChannelBean("育儿",false,false));
normalDatas.add(new ChannelBean("数码",false,false));
normalDatas.add(new ChannelBean("健康",false,false));
adaper.setChannelDatas(selectDatas,normalDatas);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
private boolean isEditMode = false;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.e_action) {
isEditMode = !isEditMode;
item.setTitle(isEditMode ? "完成" : "编辑");
return true;
}
return super.onOptionsItemSelected(item);
}
}
2.适配器页面
package com.example.recycleview01.ui.adaper;
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 com.example.recycleview01.Bean.ChannelBean;
import com.example.recycleview01.R;
import java.util.ArrayList;
import java.util.List;
public class RecycleAdaper extends RecyclerView.Adapter<RecycleAdaper.ViewHolder> {
private List<ChannelBean> selectChannel;
private List<ChannelBean> normalChannel;
private Context mContext;
public RecycleAdaper(Context mContext) {
this.mContext = mContext;
//初始化
selectChannel = new ArrayList<>();
normalChannel = new ArrayList<>();
}
public ChannelBean getItem(int position){
if(isTitle(position)){
return null;
}
//第一个选中频道列表的数据
if(isSelectChannel(position)){
return selectChannel.get(position-1);
}
//第二个未选中频道列表的数据
return normalChannel.get(position-selectChannel.size()-2);
}
//判断当前item是否是标题
public boolean isTitle(int position){
return isSelectTitle(position)||isNorlamTitle(position);
}
//是否是选中的频道标题
public boolean isSelectTitle(int position){
return position == 0;
}
//是否是普通的频道标题
public boolean isNorlamTitle(int position){
return position == selectChannel.size()+1;
}
//当前position是否是选中的频道item
public boolean isSelectChannel(int position){
return position<=selectChannel.size();
}
public void setChannelDatas(List<ChannelBean> selectChannel,List<ChannelBean> normalChannel){
this.selectChannel = selectChannel;
this.normalChannel = normalChannel;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(isTitle(position)){
return R.layout.item_channel_title;
}
if(isSelectChannel(position)){
return R.layout.item_channel_select;
}
return R.layout.item_channel_normal;
}
public ChannelBean removeItem(int position){
ChannelBean channelBean = null;
if(isSelectChannel(position)){
channelBean = selectChannel.remove(position-1);
}else{
channelBean = normalChannel.remove(position-selectChannel.size()-2);
}
//////////////////////////////
notifyItemRemoved(position);
return channelBean;
}
public void addItem(ChannelBean item){
if(item.isSelect()){
//添加到选中频道的尾部
selectChannel.add(item);
notifyItemInserted(selectChannel.size());
}else{
//添加到未选中频道的头部
normalChannel.add(0,item);
notifyItemInserted(selectChannel.size()+2);
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if(i== R.layout.item_channel_title){
return new ViewHolder(LayoutInflater.from(mContext).inflate(i,viewGroup,false));
}else{
return new ViewHolder(LayoutInflater.from(mContext).inflate(i,viewGroup,false),listener);
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
if(isSelectTitle(i)){
//我的频道
viewHolder.text.setText("我的频道");
return;
}
if(isNorlamTitle(i)){
//频道推荐
viewHolder.text.setText("频道推荐");
return;
}
viewHolder.text.setText(getItem(i).getName());
}
@Override
public int getItemCount() {
return selectChannel.size()+normalChannel.size()+2;
}
private OnItemCllickListener listener;
public RecycleAdaper setOnItemCllickListener(OnItemCllickListener listener){
this.listener = listener;
return this;
}
//定义接口
public interface OnItemCllickListener{
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 OnItemCllickListener listener) {
this(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener==null){
return;
}
listener.onItemClick(ViewHolder.this.itemView,getAdapterPosition());
}
});
}
}
}
3.主页面布局
<?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=".ui.activity.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyele"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
4.标题的本布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="标题"
android:paddingRight="16dp"
android:paddingLeft="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
/>
</android.support.constraint.ConstraintLayout>
5.选中的频道的布局
在这里插入代码片<?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:paddingBottom="5dp"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="频道名称"
android:background="@drawable/shape_text"
/>
</FrameLayout>
6.未选中的频道布局
<?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:paddingBottom="5dp"
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="频道名称"
android:padding="10dp"
android:gravity="center_horizontal"
android:background="@drawable/shape_text"
/>
</FrameLayout>
7.方框用shape做
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<size
android:width="50dp"
android:height="20dp"
/>
<stroke
android:color="#ccc"
android:width="1dp"
/>
</shape>
8.头部编辑和完成切换
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/e_action" android:title="编辑" app:showAsAction="always"/>
</menu>
9.bean类
package com.example.recycleview01.Bean;
public class ChannelBean {
//名称
private String name;
//是否选择的频道
private boolean isSelect;
//是否当前频道
private boolean isCurrent;
//是否固定不能更改的
private boolean isFixted;
public ChannelBean(String name, boolean isSelect, boolean isCurrent) {
this.name = name;
this.isSelect = isSelect;
this.isCurrent = isCurrent;
}
public String getName() {
return !isSelect?"+"+name:name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSelect() {
return isSelect;
}
public void setSelect(boolean select) {
isSelect = select;
}
public boolean isCurrent() {
return isCurrent;
}
public void setCurrent(boolean current) {
isCurrent = current;
}
public boolean isFixted() {
return isFixted;
}
public void setFixted(boolean fixted) {
isFixted = fixted;
}
}