Giải pháp chuyển đổi số trọn gói cho doanh nghiệp Việt

Xây dụng UI code cho ItemListFragment - Tài liệu lập trình android

Tài liệu lập trình android

← Toàn bộ tài liệu


Bước 18: Xây dụng UI code cho ItemListFragment

Bài 18/36 Xem dạng sách

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

Sơ đồ quan hệ các bảng

Table Name: {{table.name}}
Num Name Type
{{field_index+1}}
{{field.name}} {{field.type}}

Hỏi đáp

Gửi với tên {{comment_full_name}}

Chưa có câu hỏi nào cho bài này.

Zalo 0936.006.058 Hotline 0936.006.058