I am facing very strange problem. I am using recycler view and passing an ArrayList of data. that list has data I have checked and Adapter is calling " getItemCount() " method but not calling " onCreateViewHolder/onBindViewHolder method. Below is the code I am using
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/ll_main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ContactsListActivity">
<TextView
android:id="@+id/tv_network_notifier_view"
android:layout_width="match_parent"
android:layout_height="@dimen/network_notifier_width"
android:background="@android:color/black"
android:gravity="center"
android:textColor="@android:color/white"
android:visibility="gone" />
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="@dimen/tool_bar_height"
android:background="@color/colorPrimary"
android:minHeight="?attr/actionBarSize">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/backButton"
android:layout_width="@dimen/action_icon"
android:layout_height="@dimen/action_icon"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:background="?selectableItemBackgroundBorderless"
android:padding="10dp"
android:src="@drawable/back_ico" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:paddingLeft="10dp"
android:text="Contacts"
android:textColor="@color/white"
android:textSize="@dimen/text_heading_title" />
</RelativeLayout>
</androidx.appcompat.widget.Toolbar>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary">
<androidx.appcompat.widget.SearchView
android:id="@+id/contactSearchView"
android:layout_width="match_parent"
android:layout_height="@dimen/button_height_dialog"
android:layout_marginLeft="23dp"
android:layout_marginTop="10dp"
android:layout_marginRight="23dp"
android:layout_marginBottom="10dp"
android:background="@drawable/button_fill_white"
app:iconifiedByDefault="false" />
</LinearLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/contactsList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/ll_contact_number"
android:layout_marginTop="5dp" />
<LinearLayout
android:id="@+id/nofriendAvailable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:layout_width="@dimen/logo_size"
android:layout_height="@dimen/logo_size"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:src="@drawable/ic_gray_logo" />
<TextView
android:layout_width="wrap_content"
android:layout_height="@dimen/edittext_height"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="No Friends Available"
android:textAllCaps="false"
android:textColor="@color/colorGray"
android:textSize="@dimen/text_very_small" />
</LinearLayout>
<RelativeLayout
android:id="@+id/ll_contact_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/rl_dialer_pad"
android:background="@color/white"
android:orientation="horizontal">
<EditText
android:id="@+id/et_phone_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/text_main"
android:clickable="false"
android:cursorVisible="false"
android:focusable="false"
android:gravity="fill_vertical|center"
android:maxLines="1"
android:scrollHorizontally="true"
android:textColor="@android:color/black"
android:textSize="@dimen/phone_number_text_size"
android:textStyle="bold"
android:visibility="gone" />
<ImageView
android:id="@+id/img_delete_number"
android:layout_width="@dimen/delete_number_width"
android:layout_height="@dimen/delete_number_height"
android:layout_alignParentRight="true"
android:layout_marginRight="@dimen/margin_right_for_dialer_number_delete"
android:layout_marginBottom="@dimen/margin_bottom_for_dialer_number_delete"
android:onClick="onClick"
android:padding="@dimen/padding_delete_number"
android:src="@drawable/back_dial_ico"
android:visibility="gone" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_dialer_pad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/rl_bottom_dialer_view"
android:background="@color/white"
android:paddingLeft="@dimen/dialer_button_margin_left"
android:paddingRight="@dimen/dialer_button_margin_right"
android:visibility="gone">
<LinearLayout
android:id="@+id/Row1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:orientation="horizontal"
android:weightSum="5">
<!-- Buttons 1 2 3 -->
<ImageButton
android:id="@+id/Button1"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num1" />
<ImageButton
android:id="@+id/Button2"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num2" />
<ImageButton
android:id="@+id/Button3"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num3" />
</LinearLayout>
<!-- Buttons 4 5 6 -->
<LinearLayout
android:id="@+id/Row2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/Row1"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:weightSum="5">
<ImageButton
android:id="@+id/Button4"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num4" />
<ImageButton
android:id="@+id/Button5"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num5" />
<ImageButton
android:id="@+id/Button6"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num6" />
</LinearLayout>
<!-- Buttons 7 8 9 -->
<LinearLayout
android:id="@+id/Row3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/Row2"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:weightSum="5">
<ImageButton
android:id="@+id/Button7"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num7" />
<ImageButton
android:id="@+id/Button8"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num8" />
<ImageButton
android:id="@+id/Button9"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num9" />
</LinearLayout>
<!-- Buttons * 0 # -->
<LinearLayout
android:id="@+id/Row4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/Row3"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:weightSum="5">
<ImageButton
android:id="@+id/ButtonStar"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num0l" />
<ImageButton
android:id="@+id/Button0"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num0" />
<ImageButton
android:id="@+id/ButtonHash"
style="@style/DialerButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:src="@drawable/num0r" />
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_bottom_dialer_view"
android:layout_width="match_parent"
android:layout_height="@dimen/dialer_button_height"
android:layout_alignParentBottom="true"
android:background="@color/white">
<ImageView
android:id="@+id/iv_dialer_opener"
android:layout_width="@dimen/dialer_button_width"
android:layout_height="@dimen/dialer_button_height"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:src="@drawable/dialer_opener"
android:tag="dialer" />
<ImageView
android:id="@+id/iv_dialer_closer"
android:layout_width="@dimen/dialer_button_width"
android:layout_height="@dimen/dialer_button_height"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:src="@drawable/dial_ico"
android:tag="dialer"
android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
Below is the Adater
public class ContactCallAdapter extends RecyclerView.Adapter<ContactCallAdapter.ViewHolder> {
private static final String TAG = ContactCallAdapter.class.getSimpleName();
private List<ContactModel> contactsList;
private List<ContactModel> contactsListCopy = new ArrayList<>();
private Context context;
private OnContactClickListener onContactClickListener;
private OnCallClickListener onCallClickListener;
private boolean isCall = false;
boolean isPending = false;
private int callType = 0;
private OnInviteCLickListener onInviteCLickListener;
private OnCancelClickListener onCancelClickListener;
public interface OnInviteCLickListener {
void onitemClick(String fromWhere, String customerLoginID);
}
public interface OnCancelClickListener {
void onClick(ContactModel contactModel);
}
public ContactCallAdapter(OnInviteCLickListener listener, int callType, List<ContactModel> contactsList, OnContactClickListener onContactClickListener,
OnCallClickListener onCallClickListener) {
LogUtility.logInfo(TAG, "Constructor is called");
this.contactsList = contactsList;
contactsListCopy.addAll(contactsList);
this.onContactClickListener = onContactClickListener;
this.onCallClickListener = onCallClickListener;
this.callType = callType;
this.onInviteCLickListener = listener;
if (callType != 0) isCall = true;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LogUtility.logInfo(TAG, "onCreateViewHolder is called");
context = parent.getContext();
Activity activity = (Activity) context;
FontsUtility.applyCustomFont(activity);
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact_for_call, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
LogUtility.logInfo(TAG, "onBindViewHolder is called");
holder.bind(position, onContactClickListener, onCallClickListener);
}
@Override
public int getItemCount() {
LogUtility.logInfo(TAG, "getItemCount and count is " + contactsList.size() + " hashcode is " + contactsList.hashCode());
return contactsList.size();
}
And below is Activity Code
public class ContactsListActivity extends BaseActivity implements ContactCallAdapter.OnInviteCLickListener, OnContactClickListener {
private final String TAG = ContactsListActivity.class.getSimpleName();
private static final byte ZER0 = 0;
private TextView tvNetworkStatusNotifier;
private boolean shouldShowDialer;
public static synchronized ContactsListActivity getInstance() {
return mInstance;
}
static ContactsListActivity mInstance = null;
private RecyclerView recyclerView;
private androidx.appcompat.widget.SearchView contactSearchView;
private ImageButton imgBtn0, imgBtn1, imgBtn2, imgBtn3, imgBtn4, imgBtn5, imgBtn6, imgBtn7, imgBtn8, imgBtn9, imgBtnAsteric, imgBtnHash;
private ImageView imgDeleteNumber, backButton, ivDialerPadOpener, ivDialerCloser;
private RelativeLayout rlDialerPad;
private EditText etPhoneNumber;
private RelativeLayout rlContactNumber, rlBottomViewDialer;
ContactCallAdapter adapter;
Context context;
AppSharedPref pref;
Dialog progressDialog;
protected IHubProxy hub = null;
ArrayList<ContactModel> arrayListContact;
ArrayList<RequestModel> arrayListRequest;
ArrayList<RequestModel> arrayListRequestCount;
ArrayList<RequestModel> arrayListRequestOtherContact;
int callType = 0;
ArrayList<ContactModel> arrayPendingListContact;
TextView tvNotificationcount;
Integer whichOneUpdate = null;
SwipeRefreshLayout swipeLayout;
Dialog dialog;
boolean update = false;
LinearLayout nofriendAvailable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts_list);
FontsUtility.applyCustomFont(this);
context = this;
mInstance = this;
if (getResources().getBoolean(R.bool.portrait_only)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
pref = AppSharedPref.getInstance();
progressDialog = Utils.progressDialog(context);
recyclerView = findViewById(R.id.contactsList);
nofriendAvailable = findViewById(R.id.nofriendAvailable);
imgDeleteNumber = findViewById(R.id.img_delete_number);
ivDialerPadOpener = findViewById(R.id.iv_dialer_opener);
ivDialerCloser = findViewById(R.id.iv_dialer_closer);
rlDialerPad = findViewById(R.id.rl_dialer_pad);
rlBottomViewDialer = findViewById(R.id.rl_bottom_dialer_view);
etPhoneNumber = findViewById(R.id.et_phone_number);
tvNetworkStatusNotifier = findViewById(R.id.tv_network_notifier_view);
tvNotificationcount = findViewById(R.id.tvNotificationcount);
contactSearchView = findViewById(R.id.contactSearchView);
rlContactNumber = findViewById(R.id.ll_contact_number);
contactSearchView.setQueryHint("Search");
EditText searchEditText =
searchEditText.setHintTextColor(getResources().getColor(R.color.colorGray));
ImageView icon = contactSearchView.findViewById(R.id.search_button);
icon.setImageResource(R.drawable.search_gray_ico_la);
icon.setColorFilter(Color.BLACK);
ImageView iconClose =
contactSearchView.findViewById(R.id.search_close_btn);
iconClose.setColorFilter(getResources().getColor(R.color.black2));
iconClose.setImageResource(R.drawable.close_gray_ico_la);
arrayListContact = new ArrayList<>();
arrayListRequest = new ArrayList<>();
arrayListRequestCount = new ArrayList<>();
arrayPendingListContact = new ArrayList<>();
arrayListRequestOtherContact = new ArrayList<>();
whichOneUpdate = 1;
contactSearchView.setVisibility(View.VISIBLE);
Intent intent = getIntent();
if (intent.hasExtra(Constants.PARAM_TYPE)) {
callType = intent.getIntExtra(Constants.PARAM_TYPE, 0);
//from call
}
if (intent.hasExtra(Constants.PARAM_SHOULD_SHOW_DIALER)) {
shouldShowDialer = intent.getBooleanExtra(Constants.PARAM_SHOULD_SHOW_DIALER, false);
if (shouldShowDialer)
rlBottomViewDialer.setVisibility(View.VISIBLE);
else
rlBottomViewDialer.setVisibility(View.GONE);
}
swipeLayout.setOnRefreshListener(() -> {
contactSearchView.setQuery("", false);
swipeLayout.setRefreshing(true);
//getContacts(true);
getAllContactsAgain();
swipeLayout.setRefreshing(false);
});
contactSearchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String newText) {
if (adapter != null)
adapter.filter(newText);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (adapter != null)
adapter.filter(newText);
return true;
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setItemAnimator(new DefaultItemAnimator());
getAllContactsAgain();
}
}
public void getAllContactsAgain() {
arrayListContact.clear();
arrayListRequestOtherContact.clear();
arrayPendingListContact.clear();
if (Utils.checkPermissionContact(context))
if (shouldShowDialer)
arrayListContact = getContactsList();
getContacts(false);
}
void getContacts(final boolean addtoRecyler) {
if (HubUtility.reconnectHubIfRequired(this, TAG))
return;
showDialog();
ArrayList<String> settingsList = new ArrayList<>();
settingsList.add("" + pref.getUserId());
hub = CallReceivingService.hub;
hub.Invoke(Constants.HUB_CONTACTS, settingsList,
new HubInvokeCallback() {
@Override
public void OnResult(boolean status, String response) {
dismissDialog();
swipeLayout.setRefreshing(false);
try {
ContactPojo contactPojo = new
Gson().fromJson(response, ContactPojo.class);
if (contactPojo != null) {
if (contactPojo.isStatus()) {
arrayPendingListContact.clear();
//arrayListContact.clear();
arrayPendingListContact.addAll(contactPojo.getUserList());
for (int a = 0; a <
arrayPendingListContact.size(); a++) {
if
(arrayPendingListContact.get(a).getCustomerContactType() ==
Constants.ACCEPTED
||
arrayPendingListContact.get(a).getCustomerContactType() ==
Constants.ACCEPTED_BY) {
arrayListContact.add(0,
contactPojo.getUserList().get(a));
}
}
Utils.e("Hub Size", "" +
arrayListContact.size());
adapter = new
ContactCallAdapter(ContactsListActivity.this::onitemClick, callType,
arrayListContact,
ContactsListActivity.this,
contactModel -> {
//allowed call on behalf of
statuses
if (contactModel.isPhone()) {
Intent inte = getIntent();
inte.putExtra(Constants.PARAM_SIP_CALL, contactModel.getNumber());
inte.putExtra(Constants.PARAM_SIP_CALLER_NAME, contactModel.getName());
setResult(RESULT_OK, inte);
finish();
} else {
if
(contactModel.getCustomerCommunicationStatus() == Constants.ONLINE &&
(contactModel.getCustomerContactType() == Constants.ACCEPTED ||
contactModel.getCustomerContactType() == Constants.ACCEPTED_BY)) {
Intent inte =
getIntent();
inte.putExtra(Constants.PARAM_CONTACT, contactModel);
setResult(RESULT_OK,
inte);
finish();
} else {
Utils.showMessage("User
is not available.");
}
}
});
recyclerView.setAdapter(adapter);
recyclerView.requestFocus();
}
}
isEmpty();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void OnError(Exception e) {
}
});
}
Any help would be highly appreciated. Although this question has already been asked. I have checked those. Those are not valid in my case like
As per the official documentation of the Swipe refresh layout "This layout should be made the parent of the view that will be refreshed as a result of the gesture and can only support one direct child." So consider re-structuring your layout so that the RecyclerView is the only child under Swipe refresh layout.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.