Android Studio教程11-RecycleView的使用

来源:https://www.cnblogs.com/haochen273/archive/2019/01/21/10300790.html
-Advertisement-
Play Games

[TOC] 1. RecyclerView 1.1. Add support library 1.2. 將RecyclerView添加到佈局 此文件命名為: 1.3. 主actiivty中如何調用recycleview對象 2. 實例 本節中的所有代碼已上傳到: ...


目錄

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正文 另一篇博文總結了關於SQL TRACE工具的使用方式,但是產生的trace文件格式閱讀起來並不是十分友好,為了更好的分析trace文件,Oracle也自帶了一個格式化工具 tkprof 。 tkprof 工具用於處理原始的trace文件,合併彙總trace文件當中一些項目值,然後進行格式化,這 ...
  • 一.介紹 首先說一下,我們寫項目一般都會建一個資料庫,那資料庫裡面是不是存了好多張表啊,不可能把所有的數據都放到一張表裡面,肯定要分表來存數據,這樣節省空間,數據的組織結構更清晰,解耦和程度更高,但是這些表本質上是不是還是一個整體啊,是一個項目所有的數據,那既然分表存了,就要涉及到多個表連接查詢了, ...
  • 問題一般格式為: 1366 Incorrect string value: '' for column 1300 Invalid utf8 character string: '' 向mysql插入中文(東亞字元)出現問題一般是有欄位不是utf8的問題。 向mysql插入腦殘文/火星文/特殊字元出現 ...
  • 資料庫連表查詢中的nvarchar類型欄位,tb_Users.Certificates is not null條件,is not null 會導致查詢速度慢很多(因為和“=”號條件遍歷方式不一樣)。 替換為 “LEN(tb_Users.Certificates) >0”,利用 Users.Certi ...
  • 1.1.1 hive是什麼? Hive是基於 Hadoop 的一個數據倉庫工具: 1.1.2 hive和Hadoop關係 Hive利用HDFS存儲數據,利用MapReduce查詢數據,聚合函數需要經過MapReduce,非聚合函數直接讀取hdfs塊信息,不通過MapReduce。 1.1.3 hiv ...
  • HBase是建立在Hadoop文件系統之上的分散式面向列的資料庫。它是一個開源項目,是橫向擴展的。 HBase是一個數據模型,類似於谷歌的大表設計,可以提供快速隨機訪問海量結構化數據。它利用了Hadoop的文件系統(HDFS)提供的容錯能力。 它是Hadoop的生態系統,提供對數據的隨機實時讀/寫訪 ...
  • Appache hadoop 版本:2.77 jdk:1.8 系統:centos7 註意不要在root下解壓,要單獨建一個用戶安裝hadoop及其組件。 一、先查看系統是否有自帶j #dk: rpm -qa|grep java 通常是如下4個包: rpm -e --nodeps java-1.8.0 ...
  • oracle提供了for迴圈語句,讓我們可以遍歷select搜索的結果。用法也很簡單,代碼如下: for迴圈語句還可以傳入參數: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...