RecyclerView
基础使用
默认布局管理器:LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager
均支持横向和纵向排列以及反向滑动。如横向滑动:
mLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);
//设置控件
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
//初始化
RecyclerView recyclerview=(RecyclerView)findViewById(R.id.recyclerview);
//设置为一个3列的纵向网格布局
GridLayoutManager mLayoutManager=new GridLayoutManager(this,3,GridLayoutManager.VERTICAL,false);
recyclerview.setLayoutManager(mLayoutManager);
recyclerview.etAdapter(new GridAdapter(this,datas);
//适配器
public class GridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
private Context mContext;
private List<String> datas;
//自定义监听事件
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
mOnItemClickListener = listener;
}
public static interface OnRecyclerViewItemClickListener {
void onItemClick(View view);
void onItemLongClick(View view);
}
//点击事件回调
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(v);
}
}
@Override
public void onLongClick(View v) {
if (mOnItemClickListener!= null) {
mOnItemClickListener.onItemLongClick(v);
}
}
//适配器初始化
public GridAdapter(Context context,List<String> datas) {
mContext=context;
this.datas=datas;
}
//返回条目类型,透传到onCreateViewHolder()的viewType
@Override
public int getItemViewType(int position) {
...
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
//根据viewType加载不同ViewHolder
View view = LayoutInflater.from(
mContext).inflate(R.layout.item, parent,false)
MyViewHolder holder = new MyViewHolder(view);
//给布局设置点击和长点击监听
view.setOnClickListener(this);
view.setOnLongClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//将数据与item视图进行绑定
((MyViewHolder) holder).tv.setText(datas.get(position));
}
@Override
public int getItemCount()
{
return datas == null ? 0 : datas.size();
}
//自定义ViewHolder,用于显示页数
class MyViewHolder extends RecyclerView.ViewHolder
{
private TextView tv;
public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.tv);
}
}
//添加一个item
public void addItem(Meizi meizi, int position) {
datas.add(position, meizi);
notifyItemInserted(position);
recyclerview.scrollToPosition(position);//recyclerview滚动到新加item处
}
//删除一个item
public void removeItem(final int position) {
datas.remove(position);
notifyItemRemoved(position);
}
}
条目点击事件
//通过自定义Adapter的onCreateViewHolder()设置系统监听,调用自定义监听。此处注册自定义监听实现条目点击事件
mAdapter.setOnItemClickListener(new GridAdapter.OnRecyclerViewItemClickListener() {
@Override public void onItemClick(View view) {}
@Override public void onItemLongClick(View view) {}
});
条目加载移除动画
待更新
recyclerView.setItemAnimator(new DefaultItemAnimator());
下拉刷新
1 xml:使用SwipeRefreshLayout包裹RecyclerView
2 使用
//初始化
SwipeRefreshLayout swipeRefreshLayout=(SwipeRefreshLayout) findViewById(R.id.swipe);
//调整位置
swipeRefreshLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()));
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//加载数据,配合AsyncTask使用
new GetData().execute("http://gank.io/api/data/福利/10/1");
}
});
private class GetData extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
swipeRefreshLayout.setRefreshing(true); //设置为刷新状态
}
@Override
protected String doInBackground(String... params) {
//加载数据
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
//解析数据,并刷新
mAdapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false); //停止动画
}
}
自动加载更多
监听滑动位置,如当剩下最后两个item时,记载下一页数据
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//0:静止;1:触摸滑动;2时:惯性滑动;
// 静止状态并且剩余少于两个item时,自动加载下一页
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 2 >= mLayoutManager.getItemCount()) {
//加载数据
new GetData().execute("http://gank.io/api/data/福利/10/"+(++page));
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//获取加载的最后一个可见视图在适配器的位置。
lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
//StaggeredGridLayoutManager的item位置交错,获取最后一个可视视图位置方法如下
int[] positions= mLayoutManager.findLastVisibleItemPositions(null);
lastVisibleItem =Math.max(positions[0],positions[1]);
}
});
Item拖拽和滑动删除
//绑定recyclerView,初始化时调用
itemTouchHelper.attachToRecyclerView(recyclerview);
itemTouchHelper=new ItemTouchHelper(new ItemTouchHelper.Callback() {
//设置拖拽和滑动的方向
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags=0,swipeFlags=0;
if(recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager||recyclerView.getLayoutManager() instanceof GridLayoutManager){
//网格式布局有4个方向
dragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
}else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
//线性式布局有2个方向
dragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN;
swipeFlags = ItemTouchHelper.START|ItemTouchHelper.END;
}
return makeMovementFlags(dragFlags,swipeFlags);//swipeFlags 为0的话item不滑动
}
//长摁拖拽
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int from=viewHolder.getAdapterPosition();
int to=target.getAdapterPosition();
//链表数据刷新,更新适配器中item的位置
mAdapter.notifyItemMoved(from,to);
return true;
}
//滑动删除
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int target = viewHolder.getAdapterPosition();
//链表数据和适配器刷新
}
@Override
public boolean isLongPressDragEnabled() {
return false;//true:所有item可拖拽
}
});
Item拖拽响应动画
ItemTouchHelper实现如下方法
//当item拖拽开始时调用
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){
//拖拽时设置背景色为灰色
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
}
//当item拖拽完成时调用
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
//拖拽停止时设置背景色为白色
viewHolder.itemView.setBackgroundColor(Color.WHITE);
}
//当item视图变化时调用
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
//根据item滑动偏移的值修改item透明度
viewHolder.itemView.setAlpha(1-Math.abs(dX)/screenwidth);
}
局部刷新
onBindViewHolder()中调用notifyItemRangeChanged(),同时设置新的viewHolder