Как установить видимость представления после того, как recyclerview станет пустым - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь динамически установить видимость представления, которое находится в том же фрагменте, что и recyclerview, как невидимое, когда recyclerview становится пустым. Проблема в том, что я делаю удаление элемента из recyclerview внутри Адаптер, в то время как видимость должна быть установлена ​​внутри фрагмента. Я также реализовал элементы recyclerview «смахиванием для удаления», но это было внутри фрагмента с rv и с представлениями, которые должны стать невидимыми, и он работает нормально.

Удаление из адаптера:

holder.shoppingCartDelete.setOnClickListener(new View.OnClickListener() {
 @Override
        public void onClick(View v) {
            int holderPosition = holder.getAdapterPosition();
            removeItem(holderPosition, v.getContext());
            MainActivity.shoppingCartDatabase.shoppingCartDao().delete(currentItem);

        }
    });

private void removeItem(int position, Context context) {
    shoppingCartList.remove(position);
    if (shoppingCartList.isEmpty()) {
        Toast.makeText(context, "Nu mai exista niciun produs in cos", Toast.LENGTH_LONG).show();

    // SET VISIBILITY

    }
    notifyItemRemoved(position);
}

Удаление из фрагмента - видимость изменяется после удаления последнего элемента:

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            int position = viewHolder.getAdapterPosition();
            MainActivity.shoppingCartDatabase.shoppingCartDao().delete(shoppingCartList.get(position));
            shoppingCartList.remove(position);
            shopAdapter.notifyDataSetChanged();
            verifyIfRecyclerViewIsEmpty(shopAdapter, recyclerView);
        }
    }).attachToRecyclerView(recyclerView);

Где verifyIftheRecyclerViewIsEmpty (shopAdapter, recyclerView) - метод для видимость:

 private void verifyIfRecyclerViewIsEmpty(RecyclerView.Adapter adapter, RecyclerView recyclerView) {
    if (adapter.getItemCount() == 0) {
        constraintLayout.setVisibility(View.GONE);
        recyclerView.setVisibility(View.GONE);
        textView.setVisibility(View.VISIBLE);
        btnAdd.setVisibility(View.VISIBLE);
    } else {
        constraintLayout.setVisibility(View.VISIBLE);
        recyclerView.setVisibility(View.VISIBLE);
        textView.setVisibility(View.GONE);
        btnAdd.setVisibility(View.GONE);
    }
}

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Создайте interface в новом файле:

public interface onShoppingItemRemovedListener{

void onRecyclerViewEmpty();

}

В своем adapter сделайте следующее:

class YourAdapter extends .........{

//add this
private onShoppingItemRemovedListener listener;
.....
.....


//in the constructor
public YourAdapter (onShoppingItemRemovedListener listener,..............){

this.listener = listener;
......
......
......

}


//when you delete item do this

private void removeItem(int position, Context context) {
    shoppingCartList.remove(position);
    if (shoppingCartList.isEmpty()) {
        Toast.makeText(context, "Nu mai exista niciun produs in cos", Toast.LENGTH_LONG).show();

     //at this point the recyclerview is empty, so notify the fragment
     listener.onRecyclerViewEmpty();

    }

}


}

Наконец, в fragment реализовать interface и перейти к adapter:

class YourFragement extends ........  implements onShoppingItemRemovedListener{


//now when you initialize the adapter pass the listener like this

adapter = new YourAdapter(this,...........);
.....
.....



//override this
@Override
public void onRecyclerViewEmpty(){

//this is triggered when the recycler view is completely empty

constraintLayout.setVisibility(View.GONE);
recyclerView.setVisibility(View.GONE);
textView.setVisibility(View.VISIBLE);
btnAdd.setVisibility(View.VISIBLE);


}


}
0 голосов
/ 26 мая 2020
  1. Создать интерфейс OnItemListener убедитесь, что вы реализовали его в своем фрагменте, и вызовите verifyIfRecyclerViewIsEmpty внутри метода onEmpty
public interface OnItemListener {

    void onEmpty();
}
В вашем адаптере создайте слушателя
    private OnItemListener mOnItemListener;

    public void setItemListener(IOnItemClickedListener listener) {
        mOnItemListener = listener;
    }
Метод обновления removeItem в вашем адаптере
private void removeItem(int position, Context context) {
    shoppingCartList.remove(position);
    if (shoppingCartList.isEmpty()) {
        Toast.makeText(context, "Nu mai exista niciun produs in cos", Toast.LENGTH_LONG).show();
        if (mOnItemListener != null) {
            mOnItemListener.onEmpty()
        }
    }
    notifyItemRemoved(position);
}
0 голосов
/ 26 мая 2020

Попробуйте использовать RecyclerViewEmptySupport, как указано в этом решении:

{ ссылка }

...