简体   繁体   中英

RecyclerView is not calling onCreateViewHolder method while getItemCount is called

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

  1. Returning zero from getIemCount method
  2. Not passing layout manager

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM