Как скрыть / отобразить указанный c элемент RecyclerView? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть список контактов RecyclerView, где первый элемент (позиция 0) содержит данные пользователя. Когда нажата иконка поиска на панели инструментов, я хочу, чтобы эта запись была скрыта от пользователя.

Я пытался использовать setVisibility(View.GONE) на нем, и, хотя запись скрыта, занимаемое ею место все еще было там, очень похоже на настройку setVisibility(View.INVISIBLE). Как я могу переключить видимость этой указанной c записи в VISIBLE / GONE в моем RecyclerView, или как я могу установить ее высоту только в 0dp?

РЕДАКТИРОВАТЬ:

My xml Это довольно просто, он состоит из просто RicklerView и FAB. Мой код адаптера, как показано ниже.

ContactsAdapter(
            Context context,
            List<LinphoneContact> contactsList,
            ContactViewHolder.ClickListener clickListener,
            SelectableHelper helper) {
        super(helper);
        mContext = context;
        updateDataSet(contactsList);
        mClickListener = clickListener;
    }

    @NonNull
    @Override
    public ContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        // For the first position only, use the user's own contact card
        // For all the rest, use the contact card
        switch (viewType) {
            case USER_CARD_VIEW:
                View userCard =
                        LayoutInflater.from(parent.getContext())
                                .inflate(R.layout.contacts_user_card, parent, false);
                return new ContactViewHolder(userCard, mClickListener);
            case CONTACT_CARD_VIEW:
                View contactCard =
                        LayoutInflater.from(parent.getContext())
                                .inflate(R.layout.contact_cell, parent, false);
                return new ContactViewHolder(contactCard, mClickListener);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {

        // Remove the user's card when searching contacts - DOES NOT WORK, MAKES ALL FIRST ITEMS
        // INVISIBLE
        //        if (position == 0) {
        //            if (mIsSearchMode) holder.itemView.setVisibility(View.GONE);
        //            else holder.itemView.setVisibility(View.VISIBLE);
        //        }

        if (position != 0) {

            LinphoneContact contact = (LinphoneContact) getItem(position - 1);

            holder.name.setText(contact.getFullName());

            if (!mIsSearchMode) {
                String fullName = contact.getFullName();
                if (fullName != null && !fullName.isEmpty()) {
                    holder.separatorText.setText(String.valueOf(fullName.charAt(0)));
                }
            }

            // Separator as in the big capital letter on the left to indicate sections
            holder.separator.setVisibility(
                    mIsSearchMode
                                    || (getPositionForSection(getSectionForPosition(position))
                                            != position)
                            ? View.GONE
                            : View.VISIBLE);

            holder.linphoneFriend.setVisibility(
                    contact.isInFriendList() ? View.VISIBLE : View.GONE);

            ContactAvatar.displayAvatar(contact, holder.avatarLayout);

            boolean isOrgVisible = LinphonePreferences.instance().isDisplayContactOrganization();
            String org = contact.getOrganization();
            if (org != null && !org.isEmpty() && isOrgVisible) {
                holder.organization.setText(org);
                holder.organization.setVisibility(View.VISIBLE);
            } else {
                holder.organization.setVisibility(View.GONE);
            }

            holder.delete.setVisibility(isEditionEnabled() ? View.VISIBLE : View.INVISIBLE);
            holder.delete.setChecked(isSelected(position));
            //        } else {
            //            // TODO - user's card should have whole and voicemail onClick listeners
        }

        //        Log.d("contactsAdapter", "Position: " + position);
        //        Log.d("contactsAdapter", "Section for position: " +
        // getSectionForPosition(position));
        //        Log.d(
        //                "contactsAdapter",
        //                "The other thingy: " +
        // getPositionForSection(getSectionForPosition(position)));
    }

    // +1 item count to account for user's contact card
    @Override
    public int getItemCount() {
        return mContacts.size() + 1;
    }

    public Object getItem(int position) {
        if (position >= getItemCount()) return null;
        return mContacts.get(position);
    }

    public void setIsSearchMode(boolean set) {
        mIsSearchMode = set;
    }

    [...]

    @Override
    public int getItemViewType(int position) {
        return position == 0 ? USER_CARD_VIEW : CONTACT_CARD_VIEW;
    }

По сути, я не добавляю первый элемент в свой список предметов, а вместо этого добавляю его в recyclerView и сдвигаю свой список предметов на одну позицию вверх.

1 Ответ

1 голос
/ 20 февраля 2020

хотя запись скрыта, занимаемое ею место все еще там

  • может быть потому, что вы прячете ребенка, но его родитель все еще там с его height или padding учитывая

Как я могу переключить видимость этой указанной записи c на VISIBLE / GONE в моем RecyclerView

  • Toggle видимость родителя

В вашем onBindViewHolder

 @Override
public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int i) {

    if (isButtonPressed) {
        viewHolder.parentViewId.setVisibility(View.GONE);
    }else {
        viewHolder.parentViewId.setVisibility(View.VISIBLE);
    }
}

Создайте public boolean isButtonPressed;, а при нажатии button сделайте его true и позвоните adapter.notifyDataSetChanged();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...