android5.0中RecycleView的用法

            最近学习了android5.0中新增的一个组件RecycleView,是用来代替当前的listview开发的,是因为在RecycleView中已经有了viewholder缓存,并且不同的item之间可以设置不同的布局。能非常有效地维护了意见数量有限,滚动大的数据集。使用 RecyclerView当你拥有的数据的集合,它的元素在运行时改变基于用户行为和网络事件的小部件

首先看看RecyclerView的一个小例子:

需要引入:android-support-v7-appcompat.jar

          android-v7-RecyclerView.jar来支持低版本的android系统

新建一个my_layout.xml布局文件:里边放置一个RecyclerView

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

在之前的listview开发中,我们需要自定义viewholder来缓存listView中的数据,而在RecyclerView中,已经封装好了viewholderadapter中,接下来自定义我们的adapter

public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>
{
	// 数据集
	private String[] mDataset;

	public MyAdapter2(String[] dataset)
	{
		super();
		mDataset = dataset;
	}

	@Override
	public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
	{

		// 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView

		View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);

		// 创建一个ViewHolder

		ViewHolder holder = new ViewHolder(view);

		return holder;

	}

	@Override
	public void onBindViewHolder(ViewHolder viewHolder, int i)
	{

		// 绑定数据到ViewHolder上

		viewHolder.mTextView.setText(mDataset[i]);

	}

	@Override
	public int getItemCount()
	{

		return mDataset.length;

	}

	public static class ViewHolder extends RecyclerView.ViewHolder
	{

		public TextView mTextView;

		public ViewHolder(View itemView)
		{

			super(itemView);

//			mTextView = (TextView) itemView;
			mTextView = (TextView) itemView.findViewById(R.id.view_text_id);

		}

	}

}

activity这样调用,并设置adapter

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist); 

		 // 创建一个线性布局管理器 

		 LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
		 
		 layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

		 // 设置布局管理器 

		 recyclerView.setLayoutManager(layoutManager); 

		 // 创建数据集 
		 String[] dataset = new String[100]; 

		 for (int i = 0; i < dataset.length; i++){ 

		 dataset[i] = "item" + i; 

		 } 

		 // 创建Adapter,并指定数据集 

		MyAdapter2 adapter = new MyAdapter2(dataset); 

		 // 设置Adapter 

		 recyclerView.setAdapter(adapter); 
		 
		 }

运行效果:



在这个例子中只是用到了最基本的布局,下面结合android中新增的CardView和RecycleView实现一个复杂的布局:

先看效果图:


CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角。(其实现在很多应用都自定义了Card视图,Google这回将card视图作为基本控件,可以拿来直接使用了)

Layout中为CardView设置圆角使用card_view:cardCornerRadius属性

代码中为CardView设置圆角使用CardView.setRadius方法

为CardView设置背景颜色使用card_view:cardBackgroundColor属性

1.在item布局中引入cardview组件

  <android.support.v7.widget.CardView
        android:id="@+id/cardview_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cardCornerRadius="5dp"
        app:cardElevation="0dp" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="5dp" >

            <ImageView
                android:id="@+id/image_id"
                android:layout_width="20dp"
                android:layout_height="20dp" 
                android:layout_alignParentLeft="true"
                />

            <TextView
                android:id="@+id/text_id"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:textColor="#f89ef5"
                android:textSize="20dp"
                android:layout_centerInParent="true" />
        </RelativeLayout>
    </android.support.v7.widget.CardView>

需要注意的是要在最底层的layout中引入cardview的命名空间:

xmlns:app=http://schemas.android.com/apk/res-auto

要实现不同的item有不同的布局,需要有一个type字段来作为区分,这里,我新建一个UserInfo类,如下:

public class UserInfo {
	
	public static final int hasImage = 1;
	public static final int noImage = 2;
	
	private String mUserName;
	private int userImage;
	
	int type;

	public String getmUserName() {
		return mUserName;
	}

	public void setmUserName(String mUserName) {
		this.mUserName = mUserName;
	}

	public int getUserImage() {
		return userImage;
	}

	public void setUserImage(int userImage) {
		this.userImage = userImage;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public UserInfo(String mUserName, int type) {
		this.mUserName = mUserName;
		this.type = type;
	}

	public UserInfo(String mUserName, int userImage, int type) {
		this.mUserName = mUserName;
		this.userImage = userImage;
		this.type = type;
	}
}

hasImage和noImage分别表示该item需不需要加载图片,来加载不同的布局。

接下来看看Adapter的代码:

public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{

	private List<UserInfo>mList = null;
	private Context context = null;

	public MyAdapter(List<UserInfo> mList, Context context) {
		super();
		this.mList = mList;
		this.context = context;
		//		for (int i = 0; i < mList.size(); i++) {
		//			Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());
		//		}
	}

		public void addToList(UserInfo info,int position) {
			mList.add(0, info);
			notifyItemInserted(position);
			notifyDataSetChanged();
		}


	public class TextOnClick implements OnClickListener {
		private int position = 0;
		
		public TextOnClick(int position) {
			this.position = position;
		}


		@Override
		public void onClick(View v) {
			Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();
		}
	}
	
	public class ImageOnclick implements OnClickListener {
		private int position = 0;
		
		public ImageOnclick(int position) {
			this.position = position;
		}
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();
		}
	}
	
	public class ItemOnClick implements OnItemClickListener {

		@Override
		public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,
				long arg3) {
			// TODO Auto-generated method stub
			Toast.makeText(context,"you choose the item",1000).show();
		}

	}



	@Override
	public int getItemCount() {
		return mList.size();
	}

	public class TextViewHolder extends RecyclerView.ViewHolder {
		public TextView textView = null;
		public TextViewHolder(View view) {
			super(view);
			this.textView = (TextView) view.findViewById(R.id.text_id);
		}
	}

	public class ImageTextViewHolder extends RecyclerView.ViewHolder {
		public ImageView imageView = null;
		public TextView textView = null;
		public ImageTextViewHolder(View view) {
			super(view);
			this.imageView = (ImageView) view.findViewById(R.id.image_id);
			this.textView = (TextView) view.findViewById(R.id.text_id);
		}



	}



	@Override
	public int getItemViewType(int position) {
		// TODO Auto-generated method stub
		return mList.get(position).getType();
	}

	@Override
	public void onBindViewHolder(ViewHolder holder, int position) {
		switch (getItemViewType(position)) {
		case UserInfo.hasImage:
			ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;
			imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());
			imageTextViewHolder.textView.setText(mList.get(position).getmUserName());
			imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));
			imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));
			break;
		case UserInfo.noImage:
			TextViewHolder textViewHolder = (TextViewHolder) holder;
			textViewHolder.textView.setText(mList.get(position).getmUserName());
			textViewHolder.textView.setOnClickListener(new TextOnClick(position));
		}
	}

	@Override
	public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
		ViewHolder holder = null;
		View view = null;
		switch (type) {
		case UserInfo.hasImage:
			view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);
			holder = new ImageTextViewHolder(view);
			break;
		case UserInfo.noImage:
			view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);
			holder = new TextViewHolder(view);
			break;
		}
<a target=_blank href="http://download.csdn.net/detail/mockingbirds/8312357">源码下载</a>
		return holder;
	}

}

在activity中这样调用:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
		recyclerView.setHasFixedSize(true);
		
		LinearLayoutManager linaLayout = new LinearLayoutManager(this);
		linaLayout.setOrientation(1);
		
		recyclerView.setLayoutManager(linaLayout);
		
		recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
		
		int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,
			                      R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,
			                      R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};
		
		List<UserInfo>userList = new ArrayList<UserInfo>();
		
		int position = 0;
		for (int i = 0; i < 35; i++) {
			position = (int) (Math.random() * 8);
			UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);
			UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);
			userList.add(userInfo1);
			userList.add(userInfo2);
		}
		
		final MyAdapter adapter= new MyAdapter(userList, this);
		recyclerView.setAdapter(adapter);
		
		recyclerView.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(MyActivity.this,"you choose the item",1000).show();
			}
		});
		
		Button button = (Button) findViewById(R.id.add);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);
			}
		});

<a target=_blank href="http://download.csdn.net/detail/mockingbirds/8312357">源码下载</a>


 



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值