一: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);