我们在使用RecyclerView时,更多的是通过网络请求得到数据,比如在加载图片或者列表项时,我们往往需要判断当前屏幕上显示的第一个item的postion是多少,最后一个item的postion是多少,当前屏幕共显示了几个item项,如果使用ListView或者GridView来判断当然好判断,只要实现AbsListView.OnScrollListener这个接口就可以得到,那么在RecyclerView中如何得到呢?RecyclerView中只提供了一个滚动监听器addOnScrollListener,并且不能实现AbsListView.OnScrollListener这个接口,那怎么获取呢?就是通过RecyclerView中的LayoutManager,我们使用RecyclerView时候都必须设置一个LayoutManager布局管理器,通过它我们可以轻松的得到当前屏幕共有几个item,第一个item的postion等数据,即:
- int firstIndex = mLayoutManager.findFirstVisibleItemPosition();
- int firstComIndex = mLayoutManager.findFirstCompletelyVisibleItemPosition();
- int lastIndex = mLayoutManager.findLastVisibleItemPosition();
- int lastComIndex = mLayoutManager.findLastCompletelyVisibleItemPosition();
- View view = mLayoutManager.findViewByPosition(int postion);
RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。其中StaggeredGridLayoutManager可实现交错式网格布局,正好可以用来实现瀑布流。
下面先看看效果图吧,再贴代码:
其中大部分内容实现其实是和上篇文章是一样的,就不多叙述了,就一个地方不同,就是我们在适配器中绑定ViewHolder的方法中需要重新给我们的itemView布局设置height,我这里是生成随机数来设置高度的,代码实现为:
- private void getRandomHeight(List<String> lists){
- heights = new ArrayList<>();
- for (int i = 0; i < lists.size(); i++) {
- heights.add((int)(200+Math.random()*400));
- }
- }
在onBindViewHolder方法中:
- ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
- params.height = heights.get(position);
- holder.itemView.setLayoutParams(params);
从而实现瀑布流效果。
贴一下代码吧:
MainActivity.java
- public class MainActivity extends AppCompatActivity {
- private RecyclerView mRecyclerView;
- private List<String> lists;
- private MyRecyclerAdapter adapter;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initData();
- mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView);
- mRecyclerView.setItemAnimator(new DefaultItemAnimator());
-
- mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
- adapter = new MyRecyclerAdapter(this,lists);
- mRecyclerView.setAdapter(adapter);
- adapter.setOnClickListener(new MyRecyclerAdapter.OnItemClickListener() {
- @Override
- public void ItemClickListener(View view, int postion) {
- Toast.makeText(MainActivity.this,"点击了:"+postion,Toast.LENGTH_SHORT).show();
- }
- @Override
- public void ItemLongClickListener(View view, int postion) {
-
- lists.remove(postion);
- adapter.notifyItemRemoved(postion);
- }
- });
- }
-
- private void initData() {
- lists = new ArrayList();
- for (int i = 0; i < 100; i++) {
- lists.add("" + i);
- }
- }
-
- }
MyRecyclerAdapter.java
- public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {
- private List<String> lists;
- private Context context;
- private List<Integer> heights;
- private OnItemClickListener mListener;
- public MyRecyclerAdapter(Context context,List<String> lists) {
- this.context = context;
- this.lists = lists;
- getRandomHeight(this.lists);
- }
- private void getRandomHeight(List<String> lists){
- heights = new ArrayList<>();
- for (int i = 0; i < lists.size(); i++) {
- heights.add((int)(200+Math.random()*400));
- }
- }
- public interface OnItemClickListener{
- void ItemClickListener(View view,int postion);
- void ItemLongClickListener(View view,int postion);
- }
- public void setOnClickListener(OnItemClickListener listener){
- this.mListener = listener;
- }
- @Override
- public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
- MyViewHolder viewHolder = new MyViewHolder(view);
- return viewHolder;
- }
-
- @Override
- public void onBindViewHolder(final MyViewHolder holder, int position) {
- ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
- params.height = heights.get(position);
- holder.itemView.setLayoutParams(params);
-
- holder.mTv.setText(lists.get(position));
- if(mListener!=null){
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int pos = holder.getLayoutPosition();
- mListener.ItemClickListener(holder.itemView,pos);
- }
- });
- holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- int pos = holder.getLayoutPosition();
- mListener.ItemLongClickListener(holder.itemView,pos);
- return true;
- }
- });
- }
- }
-
- @Override
- public int getItemCount() {
- return lists.size();
- }
- }
- class MyViewHolder extends RecyclerView.ViewHolder{
- TextView mTv;
- public MyViewHolder(View itemView) {
- super(itemView);
- mTv = (TextView) itemView.findViewById(R.id.textView);
- }
- }
源码下载地址:http://download.csdn.net/detail/u010687392/8868745
【注】:我们在使用RecyclerView时,更多的是通过网络请求得到数据,比如在加载图片或者列表项时,我们往往需要判断当前屏幕上显示的第一个item的postion是多少,最后一个item的postion是多少,当前屏幕共显示了几个item项,如果使用ListView或者GridView来判断当然好判断,只要实现AbsListView.OnScrollListener这个接口就可以得到,那么在RecyclerView中如何得到呢?RecyclerView中只提供了一个滚动监听器addOnScrollListener,并且不能实现AbsListView.OnScrollListener这个接口,那怎么获取呢?就是通过RecyclerView中的LayoutManager,我们使用RecyclerView时候都必须设置一个LayoutManager布局管理器,通过它我们可以轻松的得到当前屏幕共有几个item,第一个item的postion等数据,即:
- int firstIndex = mLayoutManager.findFirstVisibleItemPosition();
- int firstComIndex = mLayoutManager.findFirstCompletelyVisibleItemPosition();
- int lastIndex = mLayoutManager.findLastVisibleItemPosition();
- int lastComIndex = mLayoutManager.findLastCompletelyVisibleItemPosition();
- View view = mLayoutManager.findViewByPosition(int postion);