当前位置: 首页 > news >正文

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();
        }
    }
}

相关文章:

  • 提高篇(二):高级绘图技巧:在Processing中创造精美图形
  • docker镜像转移,mac Linux
  • 前端开发高频面试题
  • 基于深度学习的红外船舶检测识别分类完整实现数据集8000+张
  • 华为端云一体化开发 初始化云db表结构和表数据(实践2.0)(HarmonyOS学习第七课)
  • uc/OS移植到stm32实现三个任务
  • K8s Pod的QoS类
  • 【NetTopologySuite类库】生成凸包
  • 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版)
  • 360数字安全:2024年2月勒索软件流行态势分析报告
  • 【html】简单网页模板源码
  • 在 Unreal Engine 5.4 中加载 5.3 版本的插件
  • 传统工科硕士想转嵌入式,时间够吗?
  • Java 的动态代理是基于什么原理?
  • 自然语言处理(NLP)技术。
  • 天行健咨询 | 谢宁DOE培训的课程内容有哪些?
  • Java为什么会成为现在主流的编程语言
  • mysql log_bin
  • 这才是计科之 Onix XV6 源码分析(3、Unix-like系统的进程调度模块)
  • 软件测试--Linux快速入门
  • 马上评|独生子女奖励不能“私了”,政府诚信是第一诚信
  • 一季度全国30强城市出炉:谁能更进一步?谁掉队了?
  • 黄道炫:南京102天——黄镇球的防空日记
  • 越老越妖的库里,成了火箭季后赛里一晃十年的噩梦
  • 铁路上海站迎五一返程客流最高峰,今日预计到达75.9万人次
  • 特朗普宣布对进口电影征收100%关税