1. RecyclerView

1.1. Add support library

dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
}

1.2. 将RecyclerView添加到布局

此文件命名为:activity_recycle_demo.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".RecycleDemoActivity"> <LinearLayout
android:id="@+id/layout01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
> <Button
android:id="@+id/linearLayout_recycle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="线性布局"/> <Button
android:id="@+id/grid_recycle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="网格布局"/> <Button
android:id="@+id/staggeredLayout_recycle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="瀑布布局"/> </LinearLayout> <android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>

1.3. 主actiivty中如何调用recycleview对象

RecycleDemoActivity.java

package com.haoch95.fristapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; import java.util.ArrayList;
import java.util.List; public class RecycleDemoActivity extends AppCompatActivity { private Button linearBT, gridBT, starBT; private RecyclerView mRecyclerView;
private RecycleAdapter mMyAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<String> list; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle_demo); linearBT = (Button)findViewById(R.id.linearLayout_recycle);
gridBT = (Button)findViewById(R.id.grid_recycle);
starBT = (Button)findViewById(R.id.staggeredLayout_recycle);
// RecyclerView的三部曲 01: 获取RecyclerView对象
mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view); initData(); linearBT.setOnClickListener(new ButtonClicked());
gridBT.setOnClickListener(new ButtonClicked());
starBT.setOnClickListener(new ButtonClicked()); // // 添加水平分割线
// mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); } private void initData() {
list = new ArrayList<>();
for (int i=0;i<20;i++){
list.add("Item" + i);
}
} class ButtonClicked implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.linearLayout_recycle:
mLayoutManager = new LinearLayoutManager(getApplicationContext());
break;
case R.id.grid_recycle:
mLayoutManager = new GridLayoutManager(getApplicationContext(),4);
break;
case R.id.staggeredLayout_recycle:
//如果传入 StaggeredGridLayoutManager.VERTICAL则该布局支持纵向滑动,那么前面的 4 则指的是 4列。
//如果传入 StaggeredGridLayoutManager.HORIZONTAL,则该布局支持横向滑动,那么前面的4 则指的是 4行
mLayoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
break;
default:
mLayoutManager = new LinearLayoutManager(getApplicationContext());
break;
}
//RecyclerView的三部曲 02:设置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL));
// RecyclerView的三部曲 03: 添加适配器,适配器需要重写
mMyAdapter = new RecycleAdapter(list, getApplicationContext());
mRecyclerView.setAdapter(mMyAdapter);
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); }
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add:
mMyAdapter.addData(1);
break;
case R.id.delete:
mMyAdapter.removeData(1);
break;
}
return true;
}
}

1.4. 重写定义Adapter

RecycleAdapter


package com.haoch95.fristapp; import android.content.Context;
import android.support.annotation.NonNull;
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 java.util.List;
import java.util.Random; public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyViewHolder> { private List<String> mList;
private Context context; public RecycleAdapter(List<String> list, Context context){
this.mList = list;
this.context = context;
} @Override
public int getItemCount() {
return mList.size();
} public class MyViewHolder extends RecyclerView.ViewHolder { public TextView mView; public MyViewHolder(@NonNull View itemView) {
super(itemView);
mView = itemView.findViewById(R.id.text_view);
}
} //创建ViewHolder
//onCreateViewHolder方法创建一个viewHolder,viewholder可以理解为一条数据的展示布局,这里我们自定义类LinearViewHolder创建一个只有TextView的item
//这里我们需要创建每条布局使用的layout:recycle_item
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new MyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycle_item, viewGroup, false));
} //填充视图
//onBindViewHolder方法为item的UI绑定展示数据
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
holder.mView.setText(mList.get(position)); holder.itemView.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) {
Toast.makeText(context, "点击子项"+position, Toast.LENGTH_SHORT).show();
}
}); } public void addData(int position) {
mList.add(position, "Insert One");
notifyItemInserted(position);
} public void removeData(int position) {
mList.remove(position);
notifyItemRemoved(position);
} public void clearALL(){
mList.clear();
notifyDataSetChanged();
} }

2. 实例

本节中的所有代码已上传到:https://github.com/haochen95

Android Studio教程11-RecycleView的使用的更多相关文章

  1. Android studio教程

    Android studio教程: http://jingyan.baidu.com/season/44062

  2. Android Studio教程从入门到精通

    最新2.0系列文章参考: Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android ...

  3. Ubuntu1404配置jdk-12.0.2并安装Android Studio教程

    最近在学习Android Studio 移动应用程序开发,但Android Studio好像对win10不太友好,所以小帅想在Ubuntu上安装Android Studio.为此小帅还去网上找了相关教 ...

  4. Android Studio 教程

    Android Studio 超详细安装教程 http://dkylin.com/archives/2019/android-studio-installation.html Android Stud ...

  5. Android Studio教程--给Android Studio安装Genymotion插件

    打开Android Studio,依次[File]-[Settings] 在打开的settings界面里找到plugins设置项,点击右侧的“Browser..”按钮 在搜索栏里输入genymotio ...

  6. Android Studio教程--Android Studio 2.1安装与配置

    1.下载Android Studio 去官网https://developer.android.com/studio/index.html下载最新版的Android Studio2.1(自备梯子) 或 ...

  7. Mac下载安装Android Studio教程

    今天把公司闲置的一台Mac-mini重装了下系统感觉用着速度还不错,平时上班用的机器USB有些问题,所以打算用这台Mac.以往开发用Intellij Idea就够用,但是这次项目引用的jar包太多,遭 ...

  8. Android studio教程:[6]创建多个Activity

    通常来说,一个android应用程序不止一个Activity(活动),更不止一个界面.于是需要创建多个Activity来满足应用程序的要求,这里我将告诉大家如何添加新的Activity,并实现Acti ...

  9. Android studio教程:[5]活动的生命周期

    想要学好安卓开发,就必须理解安卓软件的生命周期,明白一个活动的创建.启动.停止.暂停.重启和销毁的过程,知道各个阶段会调用什么函数进行处理不同的情况,这里我就通过一个简单的例子让大家明白一个活动的生命 ...

  10. Android studio教程:[4]真机测试

    有了Android studio这么好用的软件,自然要有一部不错的安卓手机,然后在真机上测试自己的程序,那样才能更好的发现程序中存在的问题,毕竟模拟器不是真正的手机嘛. 工具/原料 Android s ...

随机推荐

  1. ajax请求window.open()被拦截

    项目使用ajax post后根据返回的success,需要打开一个新页面,使用window.open发现谷歌浏览器直接被拦截. 后来了解发现该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了, ...

  2. Android利用RecyclerView实现列表倒计时效果

    最近面试时,面试官问了一个列表倒计时效果如何实现,然后脑袋突然懵的了O(∩_∩)O,现在记录一下. 运行效果图 实现思路 实现方法主要有两个: 1.为每个开始倒计时的item启动一个定时器,再做更新i ...

  3. mysql 服务【安装】【启动】【停止】【卸载】【重置密码】

    windows安装:一.一机安装多个服务时,重复步骤,修改服务名即可: 1.mysqld install mysql_12336 --defaults-file="MYSQL_HOME\my ...

  4. ORACLE字符集修改ORA-02374\ORA-12899\ORA-02372

    IMPDP时部分日志显示这个警告ORA-02374: conversion error loading table "MEMXXX"."T_MEMBER_XXXX&quo ...

  5. C++基础——类继承中方法重载

    一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类 ...

  6. Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决

    最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...

  7. 两篇文章带你走入.NET Core 世界:Kestrel+Nginx+Supervisor 部署上云服务器(二)

    背景: 上一篇:两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一) 已经交待了背景,这篇就省下背景了,这是第二篇文章了,看完就木有下篇了. 直接进 ...

  8. Reading task(Introduction to Algorithms. 2nd)

    Introduction to Algorithms 2nd ed. Cambridge, MA: MIT Press, 2001. ISBN: 9780262032933. Introduction ...

  9. Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

    这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: https://www.cnblogs.com/cgzl/ ...

  10. JVM回收算法

    根搜索算法 原理:设立若干种根对象,当任何一个根对象到某一个对象均不可达时,则认为这个对象是可以被回收的.一般是对象持有的引用指向该对象不可达 在JAVA语言中,可以当做GC roots的对象有以下几 ...