您的位置:首页 > 产品设计 > UI/UE

Android 高级UI设计笔记07:RecyclerView 的使用(ListView的扩展)

2015-11-16 09:33 746 查看
1. 使用RecyclerView

在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表、应用列表、消息列表等等,但是从Android 一出生到现在并没有非常好用的列表控件,早期的 ListView 用法非常复杂,尤其是自定义列表,简直就是地狱,因为其中还涉及到很多效率优化的问题,新手很难写出高效率的基于列表应用,而且 ListView 只能垂直方向呈现内容,使用很不灵活,为了解决这个缺陷,Android 官方推出了 RecyclerView 控件,用来替代 ListView。

核心内容:

Android RecyclerView 的用法

Android RecyclerView 横向布局

Android RecyclerView 垂直布局

Android RecyclerView 表格布局

这里我们使用的Android Studio,首先新建Android工程之后,右击app,打开 “Open Module Setting” ,然后找到“Dependencies"选项,添加RecyclerView依赖库。接下来我们就可以使用RecyclerView。

(1)首先我们来到MainActivity里面,如下:

 package com.example.hebao.learnrv;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rv = new RecyclerView(this);
//先加载RecyclerView
setContentView(rv);
//然后动态设置RecyclerView
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new RecyclerView.Adapter(){
class ViewHolder extends  RecyclerView.ViewHolder {
private TextView tv;

public ViewHolder(TextView itemView) {
super(itemView);
tv = itemView;
}

public TextView getTv() {
return tv;
}
}

/**
* 创建ViewHolder
* @param viewGroup
* @param i
* @return
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return new ViewHolder(new TextView(viewGroup.getContext()));
}

/**
* 对上面自己创建的ViewHolder携带数据进行处理
* @param viewHolder
* @param i
*/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
ViewHolder vh  = (ViewHolder) viewHolder;
vh.getTv().setText("Item "+i);
}

/**
*
* 获取RecyclerView的子对象数量
*/
@Override
public int getItemCount() {
return 100;
}
} );
}

}


布署程序到模拟器上,如下:(可以上下滑动滚动)



(2)利用数组承载数据源:


 package com.example.hebao.learnrv;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rv = new RecyclerView(this);

setContentView(rv);

rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new RecyclerView.Adapter(){
private String[] data = new String[] {"hello", "二胎时代","九阴真经"};
class ViewHolder extends  RecyclerView.ViewHolder {
private TextView tv;

public ViewHolder(TextView itemView) {
super(itemView);
tv = itemView;
}

public TextView getTv() {
return tv;
}
}

/**
* 创建ViewHolder
* @param viewGroup
* @param i
* @return
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return new ViewHolder(new TextView(viewGroup.getContext()));
}

/**
* 对上面自己创建的ViewHolder携带数据进行处理
* @param viewHolder
* @param i
*/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
ViewHolder vh  = (ViewHolder) viewHolder;
vh.getTv().setText(data[i]);
}

/**
*
* 获取RecyclerView的子对象数量
*/
@Override
public int getItemCount() {
return data.length;
}
});
}

}


布署程序到模拟器上,如下:





2. 使用资源文件自定义列表项:
(1)首先来到MainActivity,如下:

 package com.example.hebao.learnrv;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class MainActivity extends AppCompatActivity {

private RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rv = new RecyclerView(this);

setContentView(rv);

rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new MyAdapter());
}

}


(2)此时MyAdapter,如下:

 package com.example.hebao.learnrv;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
* Created by hebao on 11/16/15.
*/
class MyAdapter extends RecyclerView.Adapter {
private ItemData[] data = new ItemData[] {new ItemData("东邪", "黄药师"), new ItemData("西狂","杨过")};

class ViewHolder extends RecyclerView.ViewHolder {
private View root;
private TextView tvTitle, tvContent;

public ViewHolder(View root) {
super(root);
tvTitle = (TextView) root.findViewById(R.id.tvTitle);
tvContent = (TextView) root.findViewById(R.id.tvContent);
}

public TextView getTvContent() {
return tvContent;
}

public TextView getTvTitle() {
return tvTitle;
}
}

/**
* 创建ViewHolder
*
* @param viewGroup
* @param i
* @return
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_cell,
null));
}

/**
* 对上面自己创建的ViewHolder携带数据进行处理
*
* @param viewHolder
* @param i
*/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
ViewHolder vh = (ViewHolder) viewHolder;
ItemData id = data[i];
vh.getTvTitle().setText(id.title);
vh.getTvContent().setText(id.content);

}

/**
* 获取RecyclerView的子对象数量
*/
@Override
public int getItemCount() {
return data.length;
}

}


此处我们用到了一个实体数据类ItemData,如下:

 package com.example.hebao.learnrv;

/**
* Created by hebao on 11/16/15.
*/
public class ItemData {
public String title = "title";
public String content ="content";

public ItemData(String title, String content) {
this.title = title;
this.content = content;
}
}


自定义布局文件资源为list_cell.xml:

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

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/tvTitle"
android:layout_gravity="center_horizontal" />

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/tvContent"
android:layout_gravity="center_horizontal" />
</LinearLayout>


(3)程序布署到模拟器上,如下:



3. RecyclerView的布局样式
( 1 )RecyclerView的横向布局:

修改2上面代码,如下:
list_cell.xml

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

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/tvTitle"
android:layout_gravity="center_horizontal" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/tvContent"
android:layout_gravity="center_horizontal" />
</LinearLayout>


同时来到MainActivity,如下:

 package com.example.hebao.learnrv;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class MainActivity extends AppCompatActivity {

private RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rv = new RecyclerView(this);

setContentView(rv);
//设置RecyclerView为横向布局
rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
rv.setAdapter(new MyAdapter());
}

}


布署程序到模拟器上,如下:



(2)RecyclerView的垂直布局
rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
(3)RecyclerView的表格布局:
rv.setLayoutManager(new GridLayoutManager(this,3));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: