首先,确定使用RecyclerView
我们需要 导包 把
compile 'com.android.support:recyclerview-v7:25.3.0'
加入dependencies
定义适配器
MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{
public TextView item_info;
public TextView item_title;
public ImageView imageView;
public ViewHolder(View view) {
super(view);
//item_title = (TextView) view.findViewById(R.id.title_1);
// item_info = (TextView) view.findViewById(R.id.info_1);
imageView = (ImageView) view.findViewById(R.id.sample_icon);
}
}
在MyRecyclerViewAdapter中定义内部类
//自定义的ViewHolder,持有每个Item的的所有界面元素
public static class ViewHolder extends RecyclerView.ViewHolder
由于RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现。
//define interface
public static interface OnRecyclerViewItemClickListener {
void onItemClick(View view , Object object);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.recycler_item, parent, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意这里使用getTag方法获取数据
mOnItemClickListener.onItemClick(v,v.getTag());
}
}
});
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
/**
* 数据的绑定显示
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//to do bind view
//把数据绑到每个itemView上;
holder.itemView.setTag(mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
在MainActivity onCreate
mTitles = new ArrayList();
final RecyclerView recview = (RecyclerView) findViewById(R.id.recview);
adapter = new MyRecyclerViewAdapter(this,mTitles);
adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnRecyclerViewItemClickListener() {
@Override
public void onItemClick(View view, Object object) {
Log.e("onItemClick",object+"");
}
});
// LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// GridLayoutManager layoutManager=new GridLayoutManager(this,2);
// StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,
// StaggeredGridLayoutManager.HORIZONTAL);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(
3,
StaggeredGridLayoutManager.VERTICAL);
//设置布局管理器
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelperCallback(mTitles,adapter));
helper.attachToRecyclerView(recview);
recview.setLayoutManager(layoutManager);
recview.setAdapter(adapter);
定义接口
public interface ItemTouchHelperViewHolder {
/**
* 当Item开始拖拽或者滑动的时候调用
*/
void onItemSelected();
/**
* 当Item完成拖拽或者滑动的时候调用
*/
void onItemClear();
}
让上面的ViewHolder去实现 就可以根据情况改变
public static class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder
定义ItemTouchHelperCallback
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private List mData;
private RecyclerView.Adapter adapter;
public ItemTouchHelperCallback(List mData, RecyclerView.Adapter adapter) {
this.mData = mData;
this.adapter = adapter;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//首先回调的方法 返回int表示是否监听该方向
int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//拖拽
int swipeFlags = 0 ;//侧滑删除
return makeMovementFlags(dragFlags,swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//滑动事件
Collections.swap(mData,viewHolder.getAdapterPosition(),target.getAdapterPosition());
adapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//侧滑事件
// mData.remove(viewHolder.getAdapterPosition());
// adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
@Override
public boolean isLongPressDragEnabled() {
//是否可拖拽
return true;
}
/**
* 当拖拽开始的时候调用
*
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//拖拽的时候
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
//让ViewHolder知道Item开始选中
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
//回调ItemTouchHelperVIewHolder的方法
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* 当拖拽结束的时候调用
*
* @param recyclerView
* @param viewHolder
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if (viewHolder instanceof ItemTouchHelperViewHolder) {
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
//Item移动完成之后的回调
itemViewHolder.onItemClear();
}
}
}