• Android新控件RecyclerView浅析及上拉和下拉刷新


    概述:

    RecyclerView是android-support-v7-21版本中新增的一个Widgets,RecyclerView是ListView的升级版本,更加先进和灵活。在以后的开发中我们就可以直接使用RecyclerView来替换ListView。


    特点介绍:

    1. 可横向展示

    2. 消除错位问题

    3. 标准化了ViewHolder


    横向:

    private void initHorizaontal(List<ItemModel> models) {
    		RecyclerView recyclerView = (RecyclerView) findViewById(R.id.activity_main_horizontal_recyclerview);
    
    		LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
    		layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    		recyclerView.setLayoutManager(layoutManager);
    
    		RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this, models);
    		recyclerView.setAdapter(adapter);
    	}

    竖向:

    public void initVertical(List<ItemModel> models) {
    		RecyclerView recyclerView = (RecyclerView) findViewById(R.id.activity_main_vertical_recyclerview);
    
    		LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
    		layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    		recyclerView.setLayoutManager(layoutManager);
    
    		RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this, models);
    		recyclerView.setAdapter(adapter);
    	}

    Adapter的变化:

    Google在对RecyclerView的改进中还为我们解决了一个初学者比较头痛的问题:错位。

    public class RecyclerViewAdapter extends RecyclerView.Adapter<ViewHolder> {
    
    	private List<ItemModel> mList = null;
    	
    	private Context mContext = null;
    	
    	private LayoutInflater mInflater = null;
    	
    	public RecyclerViewAdapter(Context context, List<ItemModel> list) {
    		mContext = context;
    		mList = list;
    		mInflater = LayoutInflater.from(mContext);
    	}
    	
    	@Override
    	public int getItemCount() {
    		if (mList != null) {
    			return mList.size();
    		}
    		return 0;
    	}
    
    	@Override
    	public void onBindViewHolder(ViewHolder viewHolder, int position) {
    		((ItemViewHolder)viewHolder).mLabelTextView.setText(mList.get(position).getLabel());
    	}
    
    	@Override
    	public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
    		View view = mInflater.inflate(R.layout.list_item, viewGroup, false);
    		ItemViewHolder holder = new ItemViewHolder(view);
    		
    		holder.mLabelTextView = (TextView) view.findViewById(R.id.list_item_textview);
    		
    		return holder;
    	}
    
    	public static class ItemViewHolder extends ViewHolder{
    
            public ItemViewHolder(View itemView) {
                super(itemView);
            }
            
            private TextView mLabelTextView = null;
        }
    }


    上拉或下拉刷新:

    对于下拉刷新,Android自身有一个控件SwipeRefreshLayout已经有所实现。我们把SwipeRefreshLayout包在RecyclerView的外面,然后再设置其绑定到一个OnRefreshListener上。


    布局:

    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/swipe_refresh_widget"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <android.support.v7.widget.RecyclerView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:cacheColorHint="@null"
            android:scrollbars="vertical" />
    
    </android.support.v4.widget.SwipeRefreshLayout>


    监听:

    @Override
        public void onRefresh() {
            handler.sendEmptyMessageDelayed(0, 3000);
        }

    而对于上拉刷新,我们则是自定义一个FooterView和线程来进行的。

    mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
    
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView,
                        int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) {
                        handler.sendEmptyMessageDelayed(1, 3000);
                    }
                }
    
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
                }
    
            });


    相关源码下载:

    RecyclerView初步使用

    RecyclerView的上拉和下拉刷新


  • 相关阅读:
    Sybase自增字段跳号处理
    Vault数据库还原/恢复问题
    值得一看的技术书
    原来爱一直在身边
    【转】VC++编程十大秘诀
    Qt 文件搜索
    字符串穷举算法(STL)
    C++ 流
    QML 学习(三)
    Qt Everything
  • 原文地址:https://www.cnblogs.com/fengju/p/6336091.html
Copyright © 2020-2023  润新知