您的位置:首页 > 其它

RecyclerView+CardView

2016-07-05 18:06 127 查看
RecyclerView是5.0新出的,成为了ListView的替代者,已经使用的越来越广泛了!同时,CardView的出现也提供了一种卡片式的布局美化效果。

而且,RecyclerView+CardView的结合使用现如今也比较常见。于是乎,咱也来体验一把过过瘾!!

首先,不管三七二十几,先添加依赖:

compile 'com.android.support:recyclerview-v7:23.+'
compile 'com.android.support:cardview-v7:23.+'


然后就可以在xml里使用了。在activity_main里使用v7包下的RecyclerView,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
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>
</RelativeLayout>


接下来就在MainActivity里声明使用:

package com.example.lenovo.recyclerview;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import Adapter.MyRecyclerViewAdapter;

public class MainActivity extends Activity {
private RecyclerView mRecyclerView;
private ArrayList<String> mList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}

/**
* 模拟网络数据
*/
private void initData() {
for(int i=0;i<30;i++){
mList.add("数据"+i);
}
}

/**
* 初始化recyclerview
*/
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//一句代码就能改变布局的切换,是不是很6!!
//        mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));
mRecyclerView.setAdapter(new MyRecyclerViewAdapter(this,mList));
}
}


下面的是数据适配器代码:

package Adapter;

import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.example.lenovo.recyclerview.R;
import java.util.ArrayList;

/**
* Created by shan on 2016/7/5.
*/
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context context;
private ArrayList<String> mList;

public MyRecyclerViewAdapter(Context context, ArrayList<String> list) {
this.context = context;
mList = list;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(MyViewHolder myViewHolder,  final int i) {
//绑定数据        myViewHolder.mTextView.setText(mList.get(i).toString());
//item的点击事件监听
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "点击了第"+i+"项"”, Toast.LENGTH_SHORT).show();
}
});
}

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

public class MyViewHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.textview);
}
}
}


上面用到的item样式布局很简单,就一个卡片式的TextView,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="5dp"
app:cardUseCompatPadding="true"
android:foreground="?android:attr/selectableItemBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="数据"
android:gravity="center_horizontal"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:textSize="16sp"/>
</android.support.v7.widget.CardView>


说明一下:根布局需添加命名空间(就是下面这句代码):

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


关于CardView的属性有很多,根据自己需要添加:这里我只使用了3个属性:

app:cardCornerRadius="5dp"
app:cardUseCompatPadding="true"
android:foreground="?android:attr/selectableItemBackground"


运行效果图如下:



关于更多的使用方法,后面的帖子再描述~~

—————————————————————————————————————————————————————————————————

补充:你会发现,想用好RecyclerView并不是一件简单的事情,因为他不像ListView一样,自带分割线,还响应点击事件,这些在RecyclerView中通通没有,想要实现,只能自己去实现!但是从他的名字上来看,貌似回收性能做的不错!自带了ViewHolder的封装,再也不用去写getView()中那一大坨了有木有!

关于分割线,就不多说了 ,网上可以下载到这个类,这里说一下如何实现点击事件~ 用的其实就是接口回调!

核心代码:

public void setOnItemClickListener(OnItemClickListener listener){
this.listener = listener;
}

public interface OnItemClickListener{
void onItemClick(int position);
void onItemLongClick(int position);
}


holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
listener.onItemLongClick(position);
return true;//注意这里要消费掉该事件,不然点击,长按都会响应
}
});


这里直接holder,itemView.setOnClickListener也能实现点击事件,但是不建议这样写。

然后只需要拿到实例化的adapter就可以了!

adapter.setOnItemClickListener(new NewsAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
ToastUtil.showShort(getActivity(),"点击了"+position);
}

@Override
public void onItemLongClick(int position) {
ToastUtil.showShort(getActivity(),"长按了"+position);
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: