1. 成品快速一覽
項目源碼已經上傳到Gitee碼雲了(國內的GitHub,訪問與下載速度極快,無需龜速等待),戳這裏。
成品做成了瀑布流的形式,一行代碼就可以搞定一列顯示幾行,類似於淘寶京東的商品顯示,隨心切換。
2.項目前準備
做軟件和做菜是一樣的,先準備好一些材料,這樣做菜的時候隨手就能下鍋。
2.1 新鮮的菜——最最最最新版本的Android Studio (2020年6月 目前是3.6,如有更新請下載最新版)
最新版本的Android Studio摒棄了老舊雜亂的各種包,一個AndroidX一把梭,什麼AndroidV4、V7都不用了。
2.2 美味調料——美觀的圖片與Icon
3. 項目開始
3.1 起鍋燒油——新建一個空項目
3.2 下料翻炒——新建一個Layout佈局文件,下載RecycleView組件
因爲RecycleView不是默認就存在的基本組件,我們需要在layout佈局文件中下載,無需代碼,點點鼠標就行了
RecycleView旁邊會有一個向下的箭頭,點擊確認下載就可以直接用了。
佈局代碼activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_height="match_parent"
android:layout_width="match_parent"
/>
</RelativeLayout>
3.3 撈起再放入新的料——item佈局
item從名字來看,就知道是RecycleView中顯示的項目了,我們預期的佈局應該是長這個樣子的,如下圖:
item佈局代碼:看似有點多,其實就是簡單的圖片搭配文字,設計一些間距,其實很簡單,你也可以根據自己的喜好搭配。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="10dp">
<ImageView
android:id="@+id/food1"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/food1"
/>
<TextView
android:id="@+id/text1"
android:layout_below="@id/food1"
android:lines="2"
android:ellipsize="end"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="奧爾良雞腿,美味鮮香烤制"
/>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/profile"
android:layout_below="@id/text1"
android:id="@+id/profile"
/>
<TextView
android:id="@+id/author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/profile"
android:text="樂樂愛喫飯"
android:layout_marginLeft="10dp"
android:layout_below="@id/text1"/>
<ImageView
android:id="@+id/love"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/love"
android:layout_below="@id/text1"
android:layout_toLeftOf="@id/loveNum"
/>
<TextView
android:id="@+id/loveNum"
android:layout_below="@id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7K"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
佈局的細節大家可以自己掌控,比如超出2行的字體就設置爲省略號,代碼與圖見下方。
android:lines="2"
android:ellipsize="end"
3.3.下入主食——MainActivity.java代碼(註釋在下方)
package com.example.test1;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> list;
private RecycleAdapterDome adapterDome;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_view);
list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add("奧爾良雞腿"+i+",美味鮮香,快來試試!便宜實惠又健康,還在等待什麼呢!!!!");
}
adapterDome = new RecycleAdapterDome(this,list);
LinearLayoutManager manager = new LinearLayoutManager(this);
StaggeredGridLayoutManager stagger = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(stagger);
recyclerView.setAdapter(adapterDome);
}
}
上述代碼,先獲取佈局文件中的RecycleView:
recyclerView = findViewById(R.id.recycler_view);
設置RecycleView顯示爲2列,垂直顯示:
StaggeredGridLayoutManager stagger = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
RecycleView是用來顯示數據的,我們來自定義一個數據集(正常情況下是從數據庫或者服務器上獲取的,這裏爲了方便演示簡單自做一個數據集)
list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add("奧爾良雞腿"+i+",美味鮮香,快來試試!便宜實惠又健康,還在等待什麼呢!!!!");
}
有了RecycleView、數據集,還缺什麼呢?當然是數據適配器(Adapter)
recyclerView.setAdapter(adapterDome);
3.4 加入佐料——自定義數據適配器
RecycleAdapterDemo.java:
package com.example.test1;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class RecycleAdapterDome extends RecyclerView.Adapter<RecycleAdapterDome.MyViewHolder> {
private Context context;
private List<String> list;
private View inflater;
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.text1);
}
}
//構造方法,傳入數據
public RecycleAdapterDome(Context context, List<String> list){
this.context = context;
this.list = list;
}
@NonNull
@Override
public RecycleAdapterDome.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//創建ViewHolder,返回每一項的佈局
inflater = LayoutInflater.from(context).inflate(R.layout.item1,parent,false);
MyViewHolder myViewHolder = new MyViewHolder(inflater);
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecycleAdapterDome.MyViewHolder holder, int position) {
//將數據和控件綁定
holder.textView.setText(list.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
}
RecycleView的數據適配器有點講究,需要繼承自 RecyclerView.Adapter,而且還要填入泛型數據——ViewHolder的名字
public class RecycleAdapterDome extends RecyclerView.Adapter<RecycleAdapterDome.MyViewHolder> {}
創建內部類ViewHolder負責對控件進行處理,佈局中的控件都在這裏進行初始化和管理:
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.text1);
}
}
繼承自 RecyclerView.Adapter的類需要重寫3個方法,分別是:
1.初始化創建視圖處理器
public RecycleAdapterDome onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {}
若指定了ViewHolder的名字,改動如下:
public RecycleAdapterDome.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {}
在視圖處理器中,綁定要顯示的item的佈局文件,這樣數據就會在屏幕上顯示出來了
inflater = LayoutInflater.from(context).inflate(R.layout.item1,parent,false);
2.綁定內部控件,控件的具體操作都在這裏面管理
public void onBindViewHolder(@NonNull RecycleAdapterDome.MyViewHolder holder, int position) {}
3.獲取item的總數目
public int getItemCount() {}