Android之 RecyclerView,CardView 詳解和相對應的上拉刷新下拉加載

隨着 Google 推出了全新的設計語言 Material Design,還迎來了新的 Android 支持庫 v7,其中就包含了 Material Design 設計語言中關於 Card 卡片概念的實現 —— CardView。RecyclerView也是谷歌V7包下新增的控件,用來替代ListView的使用,在RecyclerView標準化了ViewHolder相似於ListView中convertView用來作視圖緩存.android

RecyclerView的優勢就是,他能夠經過設置LayoutManager來快速實現listview、gridview、瀑布流的效果,並且還能夠設置橫向和縱向顯示,添加動畫效果等。git

CardView實現卡片化效果。github

下拉加載使用SwipeRefreshLayout,是官方的下拉刷新控件,簡潔美觀的風格使其普遍應用在項目中。美中不足的是SwipeRefreshLayout缺乏上拉加載的效果,今天結合RecyclerView實現一個支持下拉刷新與上拉加載的SwipeRefreshLayout。緩存

案例包含了:RecyclerView基本使用,RecyclerView上拉刷新下拉加載,RecyclerView多Item佈局,CardView基本使用和CardView上拉刷新下拉加載。如圖:(注:第三個案例線顯示格式在模擬器上有問題,手機則沒問題的,手機測試效果更佳)dom

佈局:ide

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Activity:佈局

public class RecyclerViewActivity extends Activity {

    private RecyclerView recyclerView;
    private List<String> mDatas;
    private RecyclerAdapter1 adapter;
    @SuppressLint("InlinedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.demo1);
        initData();
        initView();
    }
    private void initView()
    {
        recyclerView=(RecyclerView) findViewById(R.id.demo1_recycler);
        // 設置佈局管理LayoutManager
        LinearLayoutManager manager=new LinearLayoutManager(this);
        //設置水平或者垂直
        // manager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(manager);
        // (可選)若是能夠肯定每一個item的高度是固定的,設置這個選項能夠提升性能
        recyclerView.setHasFixedSize(true);
        adapter=new RecyclerAdapter1(this,mDatas);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new IOnClickListenter() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(getApplicationContext(),position+"---"+mDatas.get(position),Toast.LENGTH_LONG).show();
            }
        });

    }
    private void initData() {
        mDatas = new ArrayList<String>();
        for (int i = 0; i <= 50; i++) {
            mDatas.add("item---" +i);
        }
    }

}

Adapter:post

public class RecyclerAdapter1 extends RecyclerView.Adapter<RecyclerAdapter1.ViewHolder>{

    private Context context;
    private List<String> list;
    public RecyclerAdapter1(Context context, List<String> list){
        this.context=context;
        this.list=list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.demo1_item,parent,false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textView.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
    private IOnClickListenter onClickListenter=null;
    public void setOnItemClickListener(IOnClickListenter listener)
    {
        this.onClickListenter=listener;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private TextView textView;

        public ViewHolder(View view)
        {
            super(view);
            textView=(TextView)view.findViewById(R.id.textview1);
            textView.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            if (onClickListenter != null) {
                onClickListenter.onItemClick(v,getPosition());
            }
        }
    }
}

上拉刷新下拉加載佈局性能

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </android.support.v7.widget.RecyclerView>


</android.support.v4.widget.SwipeRefreshLayout>

上拉刷新下拉加載Activity測試

public class RecyclerViewPullActivity extends Activity {

    private SwipeRefreshLayout swipeRefreshLayout;
    private MyRefreshRecyclerView recyclerView;
    public static  List<String> list=new ArrayList<String>();
    private RecyclerAdapter2 adapter;
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.demo2);
        initView();
    }
    private void initView(){
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_layout);
        recyclerView = (MyRefreshRecyclerView) findViewById(R.id.recycler);
        adapter=new RecyclerAdapter2();
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        swipeRefreshLayout.setColorSchemeResources(R.color.blue,R.color.green);
        swipeRefreshLayout.post(new Runnable() {
            @Override
            public void run() {
                swipeRefreshLayout.setRefreshing(true);
            }
        });
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                getData();
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false);
            }
        },1500);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        getData();
                        recyclerView.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                        swipeRefreshLayout.setRefreshing(false);
                    }
                }, 1500);
            }
        });
        recyclerView.setMyRefreshRecyclerViewListener(new MyRefreshRecyclerView.MyRefreshRecyclerViewListener() {
            @Override
            public void onLoadMore() {
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (list.size() > 14) {
                            recyclerView.setLoadMore(true);
                        } else {
                            int randomInt = new Random().nextInt(100);
                            list.add("上拉加載添加數字:" + randomInt);
                            adapter.notifyDataSetChanged();
                            recyclerView.setLoadMore(false);
                        }

                    }
                }, 1000);
            }
        });
    }

    private void getData() {
        list.clear();
        Random random = new Random();
        while (list.size() < 12) {
            int randomInt = random.nextInt(100);
            list.add(String.valueOf(randomInt));
        }
    }
}

AS添加依賴庫:

 compile 'com.android.support:recyclerview-v7:23.2.1'
  compile 'com.android.support:cardview-v7:23.2.1'

 

Eclipse下使用     RecyclerView.Jar          CardView.Jar 點擊下載  

 

因爲代碼太多,完整代碼未給出,源碼直接下載便可

源碼點擊下載

相關文章
相關標籤/搜索