ListView & RecycleView

106 阅读1分钟

一:ListView

1、模型

public class City {
    private String cityName;
    private String countryName;

    public City(String cityName, String countryName) {
        this.cityName = cityName;
        this.countryName = countryName;
    }

    public String getCityName() {
        return cityName;
    }

    public String getCountryName() {
        return countryName;
    }
}

2、适配器

public class CityAdapter extends BaseAdapter {

    private Context context;
    private List<City> cityList;

    public CityAdapter(Context context, List<City> cityList) {
        this.context = context;
        this.cityList = cityList;
    }

    @Override
    public int getCount() {
        return cityList.size();
    }

    @Override
    public Object getItem(int position) {
        return cityList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    
    
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.cityNameTextView = convertView.findViewById(R.id.cityNameTextView);
        viewHolder.countryNameTextView = convertView.findViewById(R.id.countryNameTextView);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    City city = cityList.get(position);

    viewHolder.cityNameTextView.setText(city.getCityName());
    viewHolder.countryNameTextView.setText(city.getCountryName());

    return convertView;
}

    
    private static class ViewHolder { 
        TextView cityNameTextView; 
        TextView countryNameTextView;
    }
}

3、子项list_item.xml

<!-- list_item.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/cityNameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/countryNameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp" />

</LinearLayout>

4、Activity

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private CityAdapter cityAdapter;
    private List<City> cityList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.listView);

        // 创建城市数据
        cityList = new ArrayList<>();
        cityList.add(new City("New York", "USA"));
        cityList.add(new City("London", "UK"));
        cityList.add(new City("Paris", "France"));
        cityList.add(new City("Tokyo", "Japan"));

        // 创建适配器并设置给 ListView
        cityAdapter = new CityAdapter(this, cityList);
        listView.setAdapter(cityAdapter);
    }
}

二:RecycleView

1、模型同上 2、适配器

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class CityAdapter extends RecyclerView.Adapter<CityAdapter.ViewHolder> {

    private Context context;
    private List<City> cityList;

    public CityAdapter(Context context, List<City> cityList) {
        this.context = context;
        this.cityList = cityList;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView cityNameTextView;
        TextView countryNameTextView;

        public ViewHolder(View itemView) {
            super(itemView);
            cityNameTextView = itemView.findViewById(R.id.cityNameTextView);
            countryNameTextView = itemView.findViewById(R.id.countryNameTextView);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        City city = cityList.get(position);
        holder.cityNameTextView.setText(city.getCityName());
        holder.countryNameTextView.setText(city.getCountryName());
    }

    @Override
    public int getItemCount() {
        return cityList.size();
    }
    
    
    public void updateCityList(List<City> newCityList) { 
        // 使用 DiffUtil 计算差异 
        CityDiffCallback diffCallback = new CityDiffCallback(cityList, newCityList);
        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
        // 更新数据集
        cityList.clear();
        cityList.addAll(newCityList); 
        // 通知适配器数据已更改 
        diffResult.dispatchUpdatesTo(this);
    }
}

3、item.xml同上 4、activity

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private CityAdapter cityAdapter;
    private List<City> cityList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);

        // 创建城市数据
        cityList = new ArrayList<>();
        cityList.add(new City("New York", "USA"));
        cityList.add(new City("London", "UK"));
        cityList.add(new City("Paris", "France"));
        cityList.add(new City("Tokyo", "Japan"));

        // 创建适配器并设置给 RecyclerView
        cityAdapter = new CityAdapter(this, cityList);
        recyclerView.setAdapter(cityAdapter);

        // 设置布局管理器
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}

数据刷新

// 假设您已经有一个 ArrayAdapter 对象 cityAdapter,并且cityList 是您的数据集
cityList.add(new City("Los Angeles", "USA"));
cityAdapter.notifyDataSetChanged();

//recycleview
-   `notifyItemInserted(position)`:用于通知适配器在特定位置插入了新的数据项。
-   `notifyItemRemoved(position)`:用于通知适配器在特定位置移除了数据项。
-   `notifyItemChanged(position)`:用于通知适配器特定位置的数据项发生了变化。
// 假设您已经有一个 RecyclerView.Adapter 对象 cityAdapter,并且 cityList 是您的数据集
cityList.add(1, new City("Los Angeles", "USA")); // 在特定位置插入新数据项
cityAdapter.notifyItemInserted(1); // 通知适配器插入了新数据项


recycleView高效刷新

1、创建 DiffUtil.Callback 创建一个类来实现 DiffUtil.Callback 接口,用于计算新旧数据集之间的差异。这个类将告诉 DiffUtil 哪些项已更改、插入、移除或移动。

import androidx.recyclerview.widget.DiffUtil;
import java.util.List;

public class CityDiffCallback extends DiffUtil.Callback {

    private List<City> oldCityList;
    private List<City> newCityList;

    public CityDiffCallback(List<City> oldCityList, List<City> newCityList) {
        this.oldCityList = oldCityList;
        this.newCityList = newCityList;
    }

    @Override
    public int getOldListSize() {
        return oldCityList.size();
    }

    @Override
    public int getNewListSize() {
        return newCityList.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        // 比较两个数据项是否代表相同的对象(例如,通过唯一标识符比较)
        return oldCityList.get(oldItemPosition).getCityName().equals(newCityList.get(newItemPosition).getCityName());
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        // 比较两个数据项的内容是否相同(例如,所有字段都相等)
        return oldCityList.get(oldItemPosition).equals(newCityList.get(newItemPosition));
    }
}

2、(activity使用)在活动中实例化适配器,并在需要更新数据时调用 updateCityList 方法。

// 在活动中
List<City> cityList = new ArrayList<>();
CityAdapter cityAdapter = new CityAdapter(cityList);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setAdapter(cityAdapter);

// 当需要刷新数据时,调用 updateCityList 方法
List<City> newCityList = new ArrayList<>();
newCityList.add(new City("Los Angeles", "USA"));
cityAdapter.updateCityList(newCityList);