> I have used MVVM to backup my data when screen orientation changes,
> the data loads perfectly but when i set the data to the adapter class
> recylerview goes empty even when onbind and getItem count gets called.
first i thought my data not getting loaded but then i tracked the data loads and everything goes fine but recycler view shows no view inside it.
**ConsumerListActivit.java**
package com.conformiz.riderapp.Activities.ConsumersList;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatEditText;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.transition.Visibility;
import android.app.ProgressDialog;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import com.conformiz.riderapp.Adapters.CustomerListAdapter;
import com.conformiz.riderapp.Model.CustomersList.CustomersListRootResponseData;
import com.conformiz.riderapp.Model.CustomersList.CustomersListRootResponseDataProductList;
import com.conformiz.riderapp.R;
import com.conformiz.riderapp.Utilities.SharedPreferenceUtil;
import com.facebook.shimmer.Shimmer;
import com.facebook.shimmer.ShimmerFrameLayout;
import com.google.android.material.snackbar.Snackbar;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
import android.widget.EditText;
public class ConsumerListActivity extends AppCompatActivity {
public static final String TAG = "ConsumersListActivity";
private RecyclerView rvCustomersList;
private Toolbar consumersListToolbar;
private ArrayList<CustomersListRootResponseData> customersListData = new ArrayList<CustomersListRootResponseData>();
private CustomerListAdapter customerListAdapter;
private ProgressDialog progressDialog;
private EditText etSearchCustomers;
private ShimmerFrameLayout customersListShimmer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_consumer_list);
setFrontEnd();
final ConsumerListViewModel consumerListViewModel = ViewModelProviders.of(this).get(ConsumerListViewModel.class);
consumerListViewModel.setUserId(String.valueOf(SharedPreferenceUtil.getInstance(this).getUserId()));
consumerListViewModel.getCustomersList().observe(this, new Observer<ArrayList<CustomersListRootResponseData>>() {
@Override
public void onChanged(ArrayList<CustomersListRootResponseData> customersListRootResponseData) {
Log.d(TAG, "OnChaned: "+new Gson().toJson(customersListRootResponseData).toString());
if (customersListRootResponseData == null) {
Snackbar emptyData = Snackbar.make(findViewById(R.id.activity_consumer),
R.string.no_data_found_string, Snackbar.LENGTH_SHORT);
emptyData.show();
} else {
customersListData = customersListRootResponseData;
customerListAdapter.addDataToList(customersListData);
}
}
});
consumerListViewModel.getLoadingStatus().observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if(aBoolean == true){
// showProgress();
customersListShimmer.setVisibility(View.VISIBLE);
customersListShimmer.startShimmer();
rvCustomersList.setVisibility(View.GONE);
}
else{
// hideProgress();
if(customersListShimmer.getVisibility() == View.VISIBLE) {
customersListShimmer.stopShimmer();
customersListShimmer.setVisibility(View.GONE);
rvCustomersList.setVisibility(View.VISIBLE);
}
}
}
});
}
private void setFrontEnd()
{
//Setting Shimmer Layout
customersListShimmer = findViewById(R.id.customersListShimmer);
//Setting Search Edit Text
etSearchCustomers = findViewById(R.id.etSearchClient);
etSearchCustomers.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
customerListAdapter.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
//Setting tool bar
consumersListToolbar = findViewById(R.id.topToolbar);
consumersListToolbar.setTitle("Customers List");
consumersListToolbar.setTitleTextColor(Color.WHITE);
consumersListToolbar.setNavigationIcon(R.drawable.ic_back_arrow);
consumersListToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();
}
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
consumersListToolbar.setElevation(10f);
}
//Setting Recycler View
rvCustomersList = findViewById(R.id.consumerListRv);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
rvCustomersList.setLayoutManager(layoutManager);
//Setting Adapter
customerListAdapter = new CustomerListAdapter(customersListData);
rvCustomersList.setAdapter(customerListAdapter);
Log.d(TAG,"Initializing the front end");
}
private void showProgress(){
progressDialog = new ProgressDialog(ConsumerListActivity.this);
progressDialog.setMessage("Getting Data....");
progressDialog.setCancelable(false);
progressDialog.show();
}
private void hideProgress(){
if(progressDialog != null){
progressDialog.dismiss();
}
progressDialog = null;
}
}
**ConsumerListAdapter.java**
package com.conformiz.riderapp.Adapters;
import android.content.Context;
import android.opengl.Visibility;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import com.conformiz.riderapp.Model.CustomersList.CustomersListRootResponseData;
import com.conformiz.riderapp.Model.CustomersList.CustomersListRootResponseDataProductList;
import com.conformiz.riderapp.R;
import com.conformiz.riderapp.ViewHolders.CustomerListVH;
import com.conformiz.riderapp.ViewHolders.ProductsVH;
import com.conformiz.riderapp.ViewHolders.ProductsViewHolder;
import java.util.ArrayList;
import java.util.List;
import java.util.function.IntToLongFunction;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListVH> implements Filterable {
private List<CustomersListRootResponseData> customersListData = new ArrayList<>();
private List<CustomersListRootResponseData> customersListDataFull;
private RecyclerView customersProductsRv;
Context context;
public CustomerListAdapter(List<CustomersListRootResponseData> mList) {
this.customersListData = mList;
customersListDataFull = new ArrayList<>(this.customersListData);
}
@NonNull
@Override
public CustomerListVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_assignment, parent, false);
CustomerListVH customerListVH = new CustomerListVH(view);
return customerListVH;
}
@Override
public void onBindViewHolder(@NonNull final CustomerListVH holder, final int position) {
Log.d("onbinding", "HERE");
final CustomersListRootResponseData customerData = customersListData.get(position);
//Setting Child's Adapter Class for Customers Orders Product //
// ClientsProductsPerCountListAdapter clientsProductsPerCountListAdapter = new ClientsProductsPerCountListAdapter(customerData.getProductList(), position);
// holder.getRvCustomersProducts().setAdapter(clientsProductsPerCountListAdapter);
// LinearLayoutManager layoutManager = new LinearLayoutManager(context, RecyclerView.VERTICAL, false);
// holder.getRvCustomersProducts().setLayoutManager(layoutManager);
//
holder.getTvCustomerName().setText(customerData.getFullname());
holder.getTvCustomerAddress().setText(customerData.getAddress().trim());
holder.getTvCustomerPhone().setText(customerData.getCell_no_1());
holder.getEditProductIV().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (holder.getRvCustomersProducts().getVisibility() == View.VISIBLE) {
holder.getRvCustomersProducts().setVisibility(View.GONE);
} else {
holder.getRvCustomersProducts().setVisibility(View.VISIBLE);
}
}
}
);
}
@Override
public int getItemCount() {
return this.customersListData.size();
}
public void addDataToList(ArrayList<CustomersListRootResponseData> customersListData) {
if (customersListData != null && customersListData.size() > 0) {
this.customersListData.clear();
this.customersListData.addAll(customersListData);
this.notifyDataSetChanged();
}
}
@Override
public Filter getFilter() {
return customersListFilter;
}
private Filter customersListFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
List<CustomersListRootResponseData> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0) {
filteredList.addAll(customersListDataFull);
} else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (CustomersListRootResponseData data : customersListDataFull) {
if (data.getFullname().toLowerCase().contains(filterPattern) || data.getAddress().toLowerCase().contains(filterPattern)) {
filteredList.add(data);
}
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = filteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
customersListData.clear();
customersListData.addAll((List) filterResults.values);
notifyDataSetChanged();
}
};
}
Это row_assignment.xml, который я надуваю в oncreateViewholder внутри класса адаптера. Это макет, который не работал для загрузки в ландшафтном режиме.Но теперь я создал новый ресурс с альбомной ориентацией и скопировал тот же код из row_assignment.xml, и это сработало.Я не уверен, почему это не сработало, потому что по умолчанию Android подобрал бы простой row_assignment.xml, даже если row_assignment.xml (ландшафт) не присутствовал.
row_assignment.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin_2dp">
<androidx.cardview.widget.CardView
android:id="@+id/container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_customer_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:text="TextView"
android:textStyle="bold"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toStartOf="@+id/tv_customer_phone"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_customer_phone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="TextView"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="@color/liteBlueColor"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_customer_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:maxLines="1"
android:text="TextView"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_customer_name" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/rvCustomersProducts"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_customer_address"
>
<ImageView
android:id="@+id/iv_payments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/iv_product_edit"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/ic_payment_true" />
<ImageView
android:id="@+id/iv_product_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintEnd_toStartOf="@+id/iv_payments"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/iv_not_delivered_tick"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/ic_edit" />
<ImageView
android:id="@+id/iv_not_delivered_tick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintEnd_toStartOf="@+id/iv_product_edit"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/iv_delivered_tick"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/ic_not_deliver"/>
<ImageView
android:id="@+id/iv_delivered_tick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@drawable/ic_deliver"
app:layout_constraintEnd_toStartOf="@+id/iv_not_delivered_tick"
app:layout_constraintHorizontal_bias="0.07"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvCustomersProducts"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>