您的位置:首页 > 移动开发 > Android开发

Android Recycleview的用法

2017-12-20 17:19 543 查看

前言

最近没得什么项目可以做,闲来无事想写一些东西,看了看以前做的项目,用到的最多的就是列表了,今天就说一下recycleview。

这个世界并不是掌握在那些嘲笑者的手中,而恰恰掌握在能够经受得住嘲笑与批评仍不断往前走的人手中。

RecycleView 的介绍

自Android 5.0之后,谷歌公司推出了RecylerView控件,主要用于列表的展示是一个很强大的滑动组件,说到这里就会想到不是已经有listview吗?为啥还要弄一个recycleview出来了?确实我觉得这个问题回答很简单,之所以出他是因为他肯定比listview强大的,不然谷歌为啥要出它。

recycleview与listview的比较

相同:都可以实现垂直方向的滚动列表效果;都需要使用适配器(Adapter)。

不同点:ListView只能实现垂直滚动列表,但RecyclerView还可以实现水平、多列、跨列等复杂的滚动列表;RecyclerView不但需要Adapter,还必须有LayoutManager,用法更复杂一些。

recycleview说:你listview管不了的我要管,你listview管的了的我也要管,我recycleview说的,listview我吃定了,耶稣也留不住。

listview说:牛bi!

线性布局的Recycleview

效果图:



先来看看XML的布局:

<android.support.v7.widget.RecyclerView
android:id="@+id/xian_recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
</android.support.v7.widget.RecyclerView>


再来看看每一个Item的布局是怎样的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal">

<ImageView
android:id="@+id/img"
android:layout_width="150dp"
android:layout_height="match_parent" />

<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#363535"
android:textSize="14sp" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#cfcdcd"></View>

</LinearLayout>


adapter的写法

public class XianAdapter extends RecyclerView.Adapter<XianAdapter.XianHolder> {
private Context context = null;
//数据集合
private ArrayList<Name> list = null;
//点击事件的接口
private ItemClick click = null;

public XianAdapter(Context context) {
this.context = context;
list = new ArrayList<>();
}

public ItemClick getClick() {
return click;
}

public void setClick(ItemClick click) {
this.click = click;
}

public ArrayList<Name> getList() {
return list;
}

public void setList(ArrayList<Name> list) {
this.list = list;
}

@Override
public XianHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//添加item的布局文件
View view = LayoutInflater.from(context).inflate(R.layout.xian_recycle_item, parent, false);
XianHolder holder = new XianHolder(view);
return holder;
}

@Override
public void onBindViewHolder(XianHolder holder, final int position) {
//给每个item设置数据
if (list != null) {
holder.img.setImageResource(list.<
4000
span class="hljs-keyword">get(position).getImg());
holder.name.setText(list.get(position).getName());
}
//给每个item添加监听
if (click != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
click.ItemClick(position);
}
});
}
}

@Override
public int getItemCount() {
//列表的长度
return list.size();
}

class XianHolder extends RecyclerView.ViewHolder {
//找到布局文件里面的控件
private ImageView img = null;
private TextView name = null;

public XianHolder(View itemView) {
super(itemView);
img = (ImageView) itemView.findViewById(R.id.img);
name = (TextView) itemView.findViewById(R.id.name);
}
}
}


这个地方我做了一个数据的类Name

public class Name {
private String name = null;
private int img = 0;

public Name(String name, int img) {
this.name = name;
this.img = img;

}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getImg() {
return img;
}

public void setImg(int img) {
this.img = img;
}
}


还有一个接口文件

public interface ItemClick {
void ItemClick(int position);
}


再来看看主页面是怎么写的:

public class XianActivity extends AppCompatActivity{
private RecyclerView recyclerView = null;
private XianAdapter adapter = null;
private ArrayList<Name> list = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
initData();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xian);
initView();
}

public void initView(){
//找到recycleview
recyclerView = (RecyclerView) findViewById(R.id.xian_recycle);
//指定布局方式这个地方时线性布局
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
//指定好的设置给recycleview
recyclerView.setLayoutManager(manager);
//适配器弄出来
adapter = new XianAdapter(this);
//把添加好数据的结合传给适配器
adapter.setList(list);
//监听也是一样
adapter.setClick(click);
//recycleview设置适配器
recyclerView.setAdapter(adapter);
//adapter更新数据
adapter.notifyDataSetChanged();
}

//item的监听事件
private ItemClick click = new ItemClick() {
@Override
public void ItemClick(int position) {
//点击弹出每一行的名字
Toast.makeText(XianActivity.this, list.get(position).getName(), Toast.LENGTH_SHORT).show();
}
};
//插入数据
public void initData(){
list = new ArrayList<>();
list.add(new Name(" 蒙奇·D·路飞",R.mipmap.one));
list.add(new Name(" 罗罗亚·索隆 ",R.mipmap.two));
list.add(new Name("香吉士",R.mipmap.three));
list.add(new Name(" 妮可·罗宾",R.mipmap.four));
list.add(new Name("娜美",R.mipmap.five));
list.add(new Name("乌索普",R.mipmap.six));
list.add(new Name("托尼托尼·乔巴",R.mipmap.seven));
list.add(new Name("弗兰奇",R.mipmap.eight));
list.add(new Name("布鲁克 ",R.mipmap.nine));
}
}


recycleview网格布局

效果图:



要实现这种网格的效果你只需要稍微的改动一下item的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_margin="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
android:scaleType="fitXY"
android:id="@+id/img"
android:layout_width="150dp"
android:layout_height="100dp" />

<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#363535"
android:textSize="14sp" />
</LinearLayout>


然后改一句话就能实现

把线性布局的:

RecyclerView.LayoutManager manager = new LinearLayoutManager(this);


改成

RecyclerView.LayoutManager manager = new GridLayoutManager(this, 3);


这句话就是用网格布局3表示的一行有多少个。

Recycleview 瀑布流

效果图:



改下item布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#ffffff"
android:layout_margin="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
android:scaleType="fitXY"
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#363535"
android:textSize="14sp" />

</LinearLayout>


然后改一句话就能实现

把线性布局的:

RecyclerView.LayoutManager manager = new LinearLayoutManager(this);


改成

RecyclerView.LayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);


这样就搞定了瀑布流。

这篇就写到这里了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息