目錄
- 運行截圖
- 實作
- 說明
運行截圖

實作
前端部分:activity_main.xml 和 item_list.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@+id/main_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
item_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/lv_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="#000000"/>
</LinearLayout>
后端部分:MainActivity(匿名內部類方式)
package com.example.androidapplication3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<String> data; //串列資料
ListView lv; //串列
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//準備串列ListView的資料
data = new ArrayList<>();
for(int i = 1; i <= 50; i ++){
data.add("串列項"+i);
}
//獲取控制元件物件
lv = findViewById(R.id.main_lv);
/*
為串列添加配接器,至少重寫getCount()和getView方法(匿名內部類方式)
*/
lv.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
// 串列項總數
return data.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) { //引數 1-串列項下標(從0開始) 2-快取的串列項物件
/*
加載每一條串列項,
利用快取機制的思路:如果有快取的串列項,就獲取串列項物件以及相關的控制元件物件;
如果沒有快取的串列項,自己創建串列項物件,獲取回應的控制元件物件并存到串列項物件中,
最后對控制元件進行相關的顯示設定,
*/
//1.定義串列項物件、相關控制元件物件
View itemView;
TextView tv;
//2.分情況討論
if(view == null){
//如果沒有快取的串列項
//引數 1-背景關系Context 2-串列項布局檔案 3-一般是null
itemView = View.inflate(MainActivity.this,R.layout.item_list,null);//創建串列項物件
tv = itemView.findViewById(R.id.lv_tv);//獲取相關控制元件物件
ViewHolder viewHolder = new ViewHolder(tv);
itemView.setTag(viewHolder);//把相關控制元件放在控制元件快取類中,存到串列項物件中
}else{
// 如果有快取的串列項
itemView = view; //獲取串列項物件
ViewHolder viewHolder = (ViewHolder) view.getTag();
tv = viewHolder.getTv();//從快取的串列項物件中獲取控制元件快取類ViewHolder物件,并從中獲取相關控制元件
}
tv.setText(data.get(i)); //為每條串列項設定對應的資料
return itemView; //回傳串列項物件
}
//控制元件快取類
class ViewHolder{
TextView tv;
ViewHolder(TextView tv){
this.tv = tv;
}
public TextView getTv() {
return tv;
}
}
});
}
}
后端部分:若采用自定義串列配接器方式,只增加了MyListAdapter類和修改了部分MainActivity代碼
MyListAdapter類
package com.example.androidapplication3;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class MyListAdapter extends BaseAdapter {
Context context;
ArrayList<String> data;
MyListAdapter(Context context, ArrayList<String> data){
this.context = context;
this.data = data;
}
@Override
public int getCount() {
// 串列項總數
return data.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) { //引數 1-串列項下標(從0開始) 2-快取的串列項物件
/*
加載每一條串列項,
利用快取機制的思路:如果有快取的串列項,就獲取串列項物件以及相關的控制元件物件;
如果沒有快取的串列項,自己創建串列項物件,獲取回應的控制元件物件并存到串列項物件中,
最后對控制元件進行相關的顯示設定,
*/
//1.定義串列項物件、相關控制元件物件
View itemView;
TextView tv;
//2.分情況討論
if(view == null){
//如果沒有快取的串列項
//引數 1-背景關系Context 2-串列項布局檔案 3-一般是null
itemView = View.inflate(context,R.layout.item_list,null);//創建串列項物件
tv = itemView.findViewById(R.id.lv_tv);//獲取相關控制元件物件
ViewHolder viewHolder = new ViewHolder(tv);
itemView.setTag(viewHolder);//把相關控制元件放在控制元件快取類中,存到串列項物件中
}else{
// 如果有快取的串列項
itemView = view; //獲取串列項物件
ViewHolder viewHolder = (ViewHolder) view.getTag();
tv = viewHolder.getTv();//從快取的串列項物件中獲取控制元件快取類ViewHolder物件,并從中獲取相關控制元件
}
tv.setText(data.get(i)); //為每條串列項設定對應的資料
return itemView; //回傳串列項物件
}
//控制元件快取類
class ViewHolder{
TextView tv;
ViewHolder(TextView tv){
this.tv = tv;
}
public TextView getTv() {
return tv;
}
}
}
修改后的MainActivity
package com.example.androidapplication3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<String> data; //串列資料
ListView lv; //串列
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//準備串列ListView的資料
data = new ArrayList<>();
for(int i = 1; i <= 50; i ++){
data.add("串列項"+i);
}
//獲取控制元件物件
lv = findViewById(R.id.main_lv);
/*
為串列添加配接器,至少重寫getCount()和getView方法(匿名內部類方式)
*/
lv.setAdapter(new MyListAdapter(MainActivity.this,data));
}
}
說明
利用快取機制的好處:避免重復加載串列項,節約記憶體資源,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290557.html
標籤:其他
