前言:
最近的新项目使用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<ArrayList<Lender>> callback) {
CollectionReference loansRef = FirebaseFirestore.getInstance().collection(FIREBASE_COLLECT_LENDERS);
loansRef.get()
.addOnSuccessListener(queryDocumentSnapshots -> {
ArrayList<Lender> 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<ArrayList<Lender>> 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(ArrayList<Lender> lenders) {
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<LenderAdapter.ViewHolder> {
private LayoutInflater mInflater;
private ArrayList<Lender> lenderList = new ArrayList<>();
private Context context;
public LenderAdapter(Context context,ArrayList<Lender> 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云数据的功能已经实现啦,如果大家有什么疑问的话,欢迎留言联系我哦!