Android控件系列——Recyclerview

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

猜你喜欢

转载自blog.csdn.net/mLuoya/article/details/87927016
今日推荐