Android --- MVVM+DataBinding+Fragment+Retrofit+Adapter 简单示例
首先,我们将使用 Retrofit 进行网络请求,所以我们需要添加 Retrofit 的依赖。在你的 build.gradle 文件中添加以下依赖:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
接下来,我们创建一个接口来定义我们的 API 请求。假设我们的 API 是获取一些项目的列表:
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface ApiService {
@GET("items")
Call<List<Item>> getItems();
}
然后,我们创建一个 Repository 类来管理数据源,包括从网络获取数据:
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ItemRepository {
private ApiService apiService;
public ItemRepository(ApiService apiService) {
this.apiService = apiService;
}
public LiveData<List<Item>> getItems() {
MutableLiveData<List<Item>> data = new MutableLiveData<>();
apiService.getItems().enqueue(new Callback<List<Item>>() {
@Override
public void onResponse(Call<List<Item>> call, Response<List<Item>> response) {
if (response.isSuccessful()) {
data.setValue(response.body());
}
}
@Override
public void onFailure(Call<List<Item>> call, Throwable t) {
// 处理失败情况
}
});
return data;
}
}
接下来,我们创建一个 ViewModel 类来管理 UI 数据,并在其中调用 Repository 获取数据:
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import java.util.List;
public class ItemViewModel extends ViewModel {
private ItemRepository itemRepository;
private LiveData<List<Item>> itemList;
public ItemViewModel(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
itemList = itemRepository.getItems();
}
public LiveData<List<Item>> getItemList() {
return itemList;
}
}
然后,我们创建一个 Fragment 类来显示项目列表:
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.myapplication.databinding.FragmentItemBinding;
import java.util.List;
public class ItemFragment extends Fragment {
private FragmentItemBinding binding;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentItemBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ApiService apiService = RetrofitClient.getApiService();
ItemRepository itemRepository = new ItemRepository(apiService);
ItemViewModel viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(ItemViewModel.class);
binding.setViewModel(viewModel);
binding.setLifecycleOwner(getViewLifecycleOwner());
RecyclerView recyclerView = binding.recyclerView;
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
final ItemAdapter adapter = new ItemAdapter();
recyclerView.setAdapter(adapter);
viewModel.getItemList().observe(getViewLifecycleOwner(), new Observer<List<Item>>() {
@Override
public void onChanged(List<Item> items) {
adapter.setItemList(items);
}
});
}
}
最后,我们创建一个 RecyclerView 的 Adapter 类:
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.myapplication.databinding.ItemLayoutBinding;
import java.util.List;
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemViewHolder> {
private List<Item> itemList;
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLayoutBinding binding = ItemLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ItemViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
Item item = itemList.get(position);
holder.bind(item);
}
@Override
public int getItemCount() {
return itemList != null ? itemList.size() : 0;
}
public void setItemList(List<Item> itemList) {
this.itemList = itemList;
notifyDataSetChanged();
}
static class ItemViewHolder extends RecyclerView.ViewHolder {
private ItemLayoutBinding binding;
ItemViewHolder(ItemLayoutBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
void bind(Item item) {
binding.setItem(item);
binding.executePendingBindings();
}
}
}