Giải pháp chuyển đổi số trọn gói cho doanh nghiệp Việt
Tên file cần tạo ItemListFragment.java
Nơi đặt file : java/com/vantinviet/adayroionline/ui/item
Nội dung file
//Tên gói
package com.vantinviet.adayroionline.ui.item;
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.annotation.VisibleForTesting;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.vantinviet.adayroionline.Config;
import com.vantinviet.adayroionline.R;
import com.vantinviet.adayroionline.binding.FragmentDataBindingComponent;
//import Fragment_Item_List
import com.vantinviet.adayroionline.databinding.FragmentItemListBinding;
//import ItemListAdapter
import com.vantinviet.adayroionline.ui.item.adapter.ItemListAdapter;
import com.vantinviet.adayroionline.ui.common.DataBoundListAdapter;
import com.vantinviet.adayroionline.ui.common.PSFragment;
import com.vantinviet.adayroionline.utils.AutoClearedValue;
import com.vantinviet.adayroionline.utils.Utils;
import com.vantinviet.adayroionline.viewmodel.item.ItemViewModel;
import com.vantinviet.adayroionline.viewobject.Item;
import com.vantinviet.adayroionline.viewobject.common.Status;
import java.util.List;
public class ItemListFragment extends PSFragment implements DataBoundListAdapter.DiffUtilDispatchedInterface {
private final androidx.databinding.DataBindingComponent dataBindingComponent = new FragmentDataBindingComponent(this);
private ItemViewModel itemViewModel;
@VisibleForTesting
private AutoClearedValue<FragmentItemListBinding> binding;
private AutoClearedValue<ItemListAdapter> adapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//set item fragment sử dụng layout fragment_item_list
FragmentItemListBinding dataBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_items_list, container, false, dataBindingComponent);
binding = new AutoClearedValue<>(this, dataBinding);
return binding.get().getRoot();
}
//Khởi tạo các ui
@Override
protected void initUIAndActions() {
//kiểm tra khi có sự kiện scroll của itemListRecyclerView
binding.get().itemListRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
//Khi người dùng kéo xong
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
LinearLayoutManager layoutManager = (LinearLayoutManager)
recyclerView.getLayoutManager();
if (layoutManager != null) {
int lastPosition = layoutManager
.findLastVisibleItemPosition();
if (lastPosition == adapter.get().getItemCount() - 1) {
if (!binding.get().getLoadingMore() && !itemViewModel.forceEndLoading) {
itemViewModel.loadingDirection = Utils.LoadingDirection.bottom;
int limit = Config.LIST_ITEMS_COUNT;
itemViewModel.start = itemViewModel.start + limit;
itemViewModel.setLoadingState(true);
itemViewModel.setNextPageItemsObj(String.valueOf(Config.LIST_ITEMS_COUNT), String.valueOf(itemViewModel.start));
}
}
}
}
});
binding.get().swipeRefresh.setColorSchemeColors(getResources().getColor(R.color.view__primary_line));
binding.get().swipeRefresh.setProgressBackgroundColorSchemeColor(getResources().getColor(R.color.global__primary));
binding.get().swipeRefresh.setOnRefreshListener(() -> {
itemViewModel.loadingDirection = Utils.LoadingDirection.top;
// reset itemViewModel.offset
itemViewModel.start = 0;
// reset itemViewModel.forceEndLoading
itemViewModel.forceEndLoading = false;
itemViewModel.setItemsObj(String.valueOf(Config.LIST_ITEMS_COUNT), String.valueOf(itemViewModel.start));
// update live data
});
}
@Override
protected void initViewModels() {
itemViewModel = ViewModelProviders.of(this, viewModelFactory).get(ItemViewModel.class);
}
@Override
protected void initAdapters() {
ItemListAdapter nvAdapter = new ItemListAdapter(dataBindingComponent, item -> navigationController.navigateToItemActivity/*Hiện tại hàm này chưa được xây dựng, chúng ta sẽ làm ở bước này nhấn vào đây để xem [Chú ý là bước này chúng ta sẽ làm sau nhé] */(ItemListFragment.this.getActivity(), item.id), this);
this.adapter = new AutoClearedValue<>(this, nvAdapter);
binding.get().itemListRecyclerView.setAdapter(adapter.get());
}
//Khởi tạo dữ liệu
@Override
protected void initData() {
// bắt đầu lấy dữ liệu
itemViewModel.setItemsObj(String.valueOf(Config.LIST_ITEMS_COUNT), String.valueOf(itemViewModel.start));
//Quan sát khi có dữ liệu được lấy về
itemViewModel.getItemsData().observe(this, result -> {
if (result != null) {
switch (result.status) {
//Nếu lấy dữ liệu về thành công
case SUCCESS:
replaceItemList(result.data);
itemViewModel.setLoadingState(false);
break;
//nếu vẫn đang trong quá trình tải
case LOADING:
replaceItemList(result.data);
break;
//nếu phát sinh một lỗi bất kỳ
case ERROR:
itemViewModel.setLoadingState(false);
break;
}
}
});
//Quan sát khi người dùng kéo scroll xuống dưới
itemViewModel.getNextPageItemsData().observe(this, state -> {
if (state != null) {
if (state.status == Status.ERROR) {
itemViewModel.setLoadingState(false);
itemViewModel.forceEndLoading = true;
}
}
});
itemViewModel.getLoadingState().observe(this, loadingState -> {
binding.get().setLoadingMore(itemViewModel.isLoading);
if (loadingState != null && !loadingState) {
binding.get().swipeRefresh.setRefreshing(false);
}
});
}
//Thực hiện việc cập nhật lại dữ liệu item
private void replaceItemList(List<Item> items) {
this.adapter.get().replace(items);
binding.get().executePendingBindings();
}
@Override
public void onDispatched() {
if (itemViewModel.loadingDirection == Utils.LoadingDirection.top) {
if (binding.get().itemListRecyclerView != null) {
LinearLayoutManager layoutManager = (LinearLayoutManager)
binding.get().itemListRecyclerView.getLayoutManager();
if (layoutManager != null) {
layoutManager.scrollToPosition(0);
}
}
}
}
}
Chưa có câu hỏi nào cho bài này.