Android进阶篇【chapter-10】 RecyclerView的使用与RecyclerView多类型视图的构造
在Build.gradle中加compile ‘com.android.support:recyclerview-v7:23.0.0’
一;RecyClerView区别于ListView(布局文件的不同):
<android.support.v7.widget.RecyclerView xmlns:android= "http://schemas.android.com/apk/res/android"
xmlns:tools= "http://schemas.android.com/tools"
android:id="@+id/activity_main_rv_news"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</android.support.v7.widget.RecyclerView >
二:RecyClerView需要一个LayoutMannager
private RecyclerView recyclerView ;//声明RecyclerView
//需要在MainAcitivity中设置LayoutManager
LinearLayoutManager manager = new LinearLayoutManager(this);//如果是在Fragment中this要写成getActivity(),获取依附在Activity的Fragment;
StaggeredGridLayoutManager manager= new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager. VERTICAL);
//为RecyclerView设置LayoutManager
recyclerView .setLayoutManager(manager);
三:自定义适配器的不同
package com.example.yangjie.test;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.w3c.dom.Text;
import java.util.ArrayList;
/**
* Created by Administrator on 2015/9/16.
*/
public class PeopleAdapter extends RecyclerView.Adapter<PeopleAdapter.ItemViewHolder>{
Context context ;
ArrayList<Person> listpeople ;
public PeopleAdapter(Context context, ArrayList<Person> listpeople) {
this .context = context;
this .listpeople = listpeople;
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(context).inflate(R.layout. item_activity,viewGroup, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
itemViewHolder.nameview.setText(listpeople.get(i).getName());
itemViewHolder.phoneview.setText(listpeople.get(i).getPhonenumber());
}
@Override
public int getItemCount() {
return listpeople.size();
}
class ItemViewHolder extends RecyclerView.ViewHolder{
private TextView nameview;
private TextView phoneview;
public ItemViewHolder(View itemView) {
super(itemView);
nameview=(TextView)itemView.findViewById(R.id.item_activty_name);
phoneview=(TextView)itemView.findViewById(R.id. item_activty_phonenumber);
}
}
}
四:RecyclerView多类型不规则视图的列表
public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private ArrayList<News> newses = new ArrayList<>();
private Context context ;
private LayoutInflater inflater ;
private View headView ;//一般都是加的视图,常见都是图片,或者按钮
public NewsAdapter(Context context,View headView) {
this .context = context;
this .inflater = LayoutInflater.from(context);
this .headView = headView;
}
public void addAll(ArrayList<News> newses){
this .newses .addAll(newses);
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
// return new ItemViewHolder(inflater.inflate(R.layout.item_news,viewGroup,false));
if (i == 1 ){
return new HeadViewHolder(headView);
}else {
return new ItemViewHolder(inflater.inflate(R.layout. item_news,viewGroup, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
if (i == 0 ){
}else {
News news = newses.get(i-1);
ItemViewHolder holder = (ItemViewHolder)viewHolder;
holder.titleView.setText(news.getTitle());
holder.contentView.setText(news.getContent());
}
}
@Override
public int getItemCount() {
return newses.size()+ 1;
}
@Override
public int getItemViewType(int position) { //列表默认返回值是0,所以把第一项的返回值设为1,其实可以是其他数字,
if (position == 0 ){
return 1;
}else {
return 0;
}
}
public class ItemViewHolder extends RecyclerView.ViewHolder{
TextView titleView,contentView;
public ItemViewHolder(View itemView) {
super(itemView);
titleView = (TextView)itemView.findViewById(R.id. item_news_title);
contentView = (TextView)itemView.findViewById(R.id.item_news_content );
}
}
public class HeadViewHolder extends RecyclerView.ViewHolder{ //同样要给加的视图写个ViewHolder
public HeadViewHolder(View itemView) {
super(itemView);
}
}
}
五:RecyclerView和CardView连用(因为listview有个分割线而RecyclerView,所以RecyclerView 和CardView 连用)(工程picture)
CardView很简单,加在布局文件最外边就可以了
<android.support.v7.widget.CardView
xmlns:android= "http://schemas.android.com/apk/res/android"
xmlns:app= "http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardBackgroundColor="#FF0000"
app:cardCornerRadius="8dp"
app:cardElevation="8dp"
>
</android.support.v7.widget.CardView>
六:RecyclerView和ListView向下滑动时候,最上面会弹出一个刷新的(可滑动的视图都可以)(工程picture)
在布局文件中:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/activity_swipe"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android :id="@+id/activity_recyclerview"
android :layout_width="match_parent"
android :layout_height="match_parent" />
//中间放可以滑动的视图,比如是listview或者recyrview,反正可滑动视图都可以
</android.support.v4.widget.SwipeRefreshLayout >
//主Activity实现 implements SwipeRefreshLayout.OnRefreshListener接口,重写 onRefresh()方法
swipeRefreshLayout.setOnRefreshListener(this);并且在onRefresh()写监听的事件
swipeRefreshLayout.setRefreshing(true );//刷新图标一直存在
swipeRefreshLayout.setRefreshing(false );//刷新图标一直消失