1

In my Application I am Having 1,46,000 Records,while applying paging Library the Data is Loading after 10 - 15 seconds.While applying Filter on the Loaded Records it takes minimum 5-10 seconds to Load.The Filter opearation is quiet good before Paging Library used in my Project.

@Dao class Looks Like This`

@Dao
public abstract class MftDao
{
     @Query("SELECT* FROM  transaction_master where AC_NO LIKE :acNo and TXN_ID LIKE :txn_id     order by TXN_DATE DESC")
     public abstract DataSource.Factory<Integer,TransactionMaster> getTotTransactions(String acNo,String txn_id);
}

ViewModel Looks Like this

    public class ReportViewModel extends AndroidViewModel {
    private MutableLiveData<TransactionMasterFilter> filter = new MutableLiveData<>();   

    private LiveData<PagedList<TransactionMaster>> transactionMasterList;
    public void setFilter(TransactionMasterFilter filter) {
        this.filter.setValue(filter);
    }

    public ReportViewModel(@NonNull Application application) {
        super(application);
        repository = new Repository(application);
        mftDao = MftDataBase.getInstance(application).getMftDao();
    }

    public void init() {
        transactionMasterList = Transformations.switchMap( filter, new Function<TransactionMasterFilter,       LiveData<PagedList<TransactionMaster>>>() {
            @Override
            public LiveData<PagedList<TransactionMaster>> apply(TransactionMasterFilter input)
            {
                DataSource.Factory<Integer,TransactionMaster> transactionMasterFactory;
                PagedList.Config pagedListConfig =
                        (new PagedList.Config.Builder()).setEnablePlaceholders(true)
                                .setPrefetchDistance(150)
                                .setPageSize(50).build();
                transactionMasterFactory = mftDao.getTotTransactions(input.acNo,input.Txn_id);
                return new LivePagedListBuilder(transactionMasterFactory,pagedListConfig).build();
            }
        } );
    }
   public static class TransactionMasterFilter
    {
        public String Txn_id;
        public String acNo;      

        public void setTxn_id(String txn_id) {
            Txn_id = "%"+txn_id+"%";
        }
        public void setAcNo(String acNo) {
            this.acNo = "%"+acNo+"%";
        }
        public TransactionMasterFilter(String txn_id, String acNo) {
            Txn_id = txn_id;
            this.acNo = acNo;
        }
    }
    public LiveData<PagedList<TransactionMaster>> getTransactionMasterList() {
        return transactionMasterList;
    }
}

Finally Activity is

    public class DailyReportActivity extends AppCompatActivity {
    ActivityDailyReportBinding dailyReportBinding;

    List<TransactionMaster> transactionMasterList = new ArrayList<>();
    Repository repository;
    ReportViewModel reportViewModel;
    ReportViewModel.TransactionMasterFilter transactionMasterFilter = new ReportViewModel.TransactionMasterFilter("%%","%%");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        dailyReportBinding = DataBindingUtil.setContentView(this, R.layout.activity_daily_report );

        reportViewModel = ViewModelProviders.of(this).get( ReportViewModel.class);
        reportViewModel.setFilter(transactionMasterFilter);
        reportViewModel.init();

        dailyReportBinding.recyclerView.setItemAnimator(new DefaultItemAnimator());

        dailyReportBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));        
        final DailyReportAdapter dailyReportAdapter = new DailyReportAdapter();
        dailyReportBinding.recyclerView.setAdapter(dailyReportAdapter);

        reportViewModel.getTransactionMasterList().observe( this, new Observer<PagedList<TransactionMaster>>() {
            @Override
            public void onChanged(PagedList<TransactionMaster> transactionMasters) {
                Log.e("",String.valueOf(transactionMasters.getLoadedCount()) + ",Tot = "+ transactionMasters.size());
                dailyReportAdapter.submitList(transactionMasters);
            }
        });


        dailyReportBinding.acNoAutoCompleteTextView.addTextChangedListener( new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                String acNo = dailyReportBinding.acNoAutoCompleteTextView.getText().toString();
                transactionMasterFilter.setAcNo(acNo);
                reportViewModel.setFilter(transactionMasterFilter);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }
}

I tried a lot to find the solution,but i didn't get it.Am I need to add indexes Or The Procedure to observe the LiveData is totally wrong? . Please Give me suggetions ,Thank you for your time

  • Actually I Solved the Problem By Adding Custom DataSource and DataSources.Factory .The Sources Code Available here https://github.com/DISANTH/paginationWithRoom.git – DISANTH KUMAR NAGIDI Mar 05 '20 at 12:53
  • Would help if you provided the code that fixed the issue. – VIN Mar 04 '21 at 04:37
  • To complete this Question on SO you could provide your own answer. Just so others don't need to traverse your sourceCode for the possible solution, and it would be very courteous to do so. – ChristianoBolla Jul 13 '21 at 07:57

0 Answers0