RecyclerView的Item点击事件的实现,增加和删除Item使用瀑布流动画效果,长按拖动Item,RecyclerView复杂布局的实现使用、RecyclerView去实现今日头条新闻频道选择器。
使用ItemTouchHelper实现Item的拖动交换,由于RecyclerView本身没有自带的Item点击事件所以我们仿照ListView的Item点击事件利用RecyclerView自带findChildViewUnder方法的自己实现点击效果。
首先我们来看一下demo的运行效果:
demo源码下载连接:(http://download.youkuaiyun.com/detail/qq_30000411/9700050)
接下来是我们代码的实现,(注:本demo拖动事件的实现为不同类型的Item之间不能进行拖动)。
RecyclerView的适配器的实现扩展Item自定义的交换的接口并且重写交换方法,每个Item布局建立不同的ViewHolder,利用GridLayoutManager来实现每一个Item应该怎样放置(传入每个类型的公倍数)。
复杂布局不用类型的Item每行多少列的代码如下:
GridLayoutManager gridLayoutManager = new
GridLayoutManager(this.getApplicationContext(),4);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
AddPinDao addPinDao = addPinDaos.get(position);
if (addPinDao.getTag() == 0 || addPinDao.getTag() == 2){
return 4;
}else {
return 1;
}
}
});
适配器的代码如下:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;
/**
* 适配器添加频道的recyclerview 的适配器
* Created by lwp940118 on 2016/11/28.
*/
public class RecyclerView_Add_Adapter extends RecyclerView.Adapter implements
RecyclerViewAddItemCallBackListener{
private int tag = 0;
private List<AddPinDao> addPinDaos;
private Context context;
public RecyclerView_Add_Adapter(List<AddPinDao> addPinDaos,Context context){
super();
this.addPinDaos = addPinDaos;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
RecyclerView.ViewHolder viewHolder = null;
switch (viewType){
case 0:
view = LayoutInflater.from(context).inflate(R.layout.recyclerview_add_item_one
,parent,false);
viewHolder = new ViewHolderOne(view);
break;
case 1:
view = LayoutInflater.from(context).inflate(R.layout.recyclerview_add_item_my
,parent,false);
viewHolder = new ViewHolderMy(view);
break;
case 2:
view = LayoutInflater.from(context).inflate(R.layout.recyclerview_add_item_tow
,parent,false);
viewHolder = new ViewHolderTow(view);
break;
case 3:
view = LayoutInflater.from(context).inflate(R.layout.recyclerview_add_item_pindao
,parent,false);
viewHolder = new ViewHolderPinDao(view);
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
AddPinDao addPinDao = addPinDaos.get(position);
switch (getItemViewType(position)){
case 0:
final ViewHolderOne viewHolderOne = (ViewHolderOne)holder;
viewHolderOne.textView_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (tag == 0) {
viewHolderOne.textView_one.setText("完 成");
viewHolderOne.textView_tuodong.setText("拖动可以排序");
tag = 1;
Log.e("----t2",""+tag);
for (int i = 0;i < addPinDaos.size();i++){
if (addPinDaos.get(i).getTag() == 1){
addPinDaos.get(i).setMyTag(1);
}
}
notifyDataSetChanged();
}else {
viewHolderOne.textView_one.setText("编 辑");
viewHolderOne.textView_tuodong.setText("");
tag = 0;
Log.e("----t1",""+tag);
for (int i = 0;i < addPinDaos.size();i++){
if (addPinDaos.get(i).getTag() == 1){
addPinDaos.get(i).setMyTag(0);
}
}
notifyDataSetChanged();
}
}
});
break;
case 1:
final ViewHolderMy viewHolderMy = (ViewHolderMy)holder;
viewHolderMy.textView_my.setText(addPinDao.getMessage());
if (addPinDao.getMyTag() == 1) {
viewHolderMy.imageView_my.setVisibility(View.VISIBLE);
}else {
viewHolderMy.imageView_my.setVisibility(View.INVISIBLE);
}
break;
case 2:
final ViewHolderTow viewHolderTow = (ViewHolderTow)holder;
break;
case 3:
final ViewHolderPinDao viewHolderPinDao = (ViewHolderPinDao)holder;
viewHolderPinDao.textView_pin.setText(addPinDao.getMessage());
break;
}
}
@Override
<