前言:
最近的新项目使用Firebase作为app的后台,即通过Firebase的sdk来获取Firestore(数据库)的实时数据。Firebase的Firestore是一种云托管数据库,该数据库将数据存储为 JSON,并以实时方式与每个连接的客户端同步。下面我简单总结一下在MVVM架构的项目中如何获取Firebase云数据。用到的知识点:
1.FirebaseFirestore获取动态数据 2.Recyclerview+Adapter展示列表信息实现的代码:
1.Google官网注册应用 首先去网址:https://console.firebase.google.com/ 去注册自己的应用,并下载google-services.json的文件,把它放到项目的app/目录。2.添加依赖
2.1 Project的build.gradle
classpath 'com.google.gms:google-services:4.1.0' 2.2 Module的build.gradle dependencies { compile 'com.google.firebase:firebase-database:15.0.1' } apply plugin: 'com.google.gms.google-services' //这一句一定要放在最下面,否则无效3.在Firebase建立实时数据库
4.在LenderRepository里面封装FirebaseFirestore获取动态数据的方法
public class LenderRepository { private static final String TAG = LenderRepository.class.getSimpleName(); /* *封装一个FirebaseFirestore获取动态数据的方法 */ public void getLenderList(CompleteCallback> callback) { CollectionReference loansRef = FirebaseFirestore.getInstance().collection(FIREBASE_COLLECT_LENDERS); loansRef.get() .addOnSuccessListener(queryDocumentSnapshots -> { ArrayList lenders = new ArrayList<>(); if (!queryDocumentSnapshots.isEmpty()) { lenders.addAll(queryDocumentSnapshots.toObjects(Lender.class)); } callback.onComplete(null, lenders); }) .addOnFailureListener(e -> { callback.onComplete(AppError.parse(e.getCause()), null); }); }}
5.DependencyInjector的类
public class DependencyInjector { // Repositories private static LenderRepository sLenderRepo; public static LenderRepository getsLenderRepository(){ if(sLenderRepo == null){ sLenderRepo = new LenderRepository(); } return sLenderRepo; }}
6.LenderViewModel的类
public class LenderViewModel extends PaddyViewModel { private LenderRepository lenderRepository = DependencyInjector.getsLenderRepository(); public void getLenderList(CompleteCallback> callback) { //判断是否有网络 if (!NetworkingManager.isNetworkConnected()) { callback.onComplete(AppError.NETWORK_CONNECTION, null); return; } lenderRepository.getLenderList(callback); }}
7.在LenderActivity调用FirebaseFirestore获取动态数据的方法
public class LenderActivity extends PaddyActivity { private ActivityLenderBinding mBinding; private LenderViewModel viewModel; private LenderAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this, R.layout.activity_lender); viewModel = obtainViewModel(LenderViewModel.class); setupViews(); } private void setupViews() { //调用FirebaseFirestore获取动态数据的方法 getLenderList(); } /* *调用FirebaseFirestore获取动态数据的方法 */ private void getLenderList() { showLoading(); viewModel.getLenderList((error, lenders) -> { if (error != null) { hideLoading(); return; } setupLender(lenders); }); } private void setupLender(ArrayListlenders) { adapter = new LenderAdapter(this, lenders); mBinding.rcvLenders.setLayoutManager(new GridLayoutManager(this, 2)); mBinding.rcvLenders.setAdapter(adapter); hideLoading(); } @Override protected PaddyViewModel getViewModel() { if (viewModel == null) { viewModel = obtainViewModel(LenderViewModel.class); } return viewModel; }}
8.适配器的代码
public class LenderAdapter extends RecyclerView.Adapter{ private LayoutInflater mInflater; private ArrayList lenderList = new ArrayList<>(); private Context context; public LenderAdapter(Context context,ArrayList lenderList) { this.context=context; this.lenderList.addAll(lenderList); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (mInflater == null) { mInflater = LayoutInflater.from(parent.getContext()); } View itemView = mInflater.inflate(R.layout.item_lenders, parent, false); return new LenderAdapter.ViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull LenderAdapter.ViewHolder holder, int position) { String logo_url = lenderList.get(position).getLogo(); setLenderImage(logo_url, holder.imvLender); String name = lenderList.get(position).getName(); holder.tvLender.setText(name); } private void setLenderImage(@NonNull String url, @NonNull ImageView imageView) { ImageUtil.load(context, imageView, url); } @Override public int getItemCount() { return lenderList.size(); } class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.imv_lender) ImageView imvLender; @BindView(R.id.tv_lender) TextView tvLender; ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }}
9.总结:
Android客户端获取Firebase云数据的功能已经实现啦,如果大家有什么疑问的话,欢迎留言联系我哦!