Как вызвать метод ViewHolder из Activity/Fragment

У меня есть три класса, а именно. Фрагмент, RecyclerViewAdapter и RecyclerViewHolder. Они работают в обычном режиме. Но теперь у меня возникла проблема, мне нужно вызвать метод в ViewHolder из указанного Activity.

Я думал об использовании обратных вызовов, но я попытался, и это не сработало. Вот что я сделал до сих пор:

Интерфейс

public interface TreeBottomListener {
    enum Status {FAILED, SUCCESS, PRE_REQUEST}
    void onResponse(Status status);
}

Вьюхолдер

public class TreeBottomViewHolder extends RecyclerView.ViewHolder implements TreeBottomListener{
    @BindView(R.id.tree_bottom_progress) ProgressBar bottomProgress;
    @BindView(R.id.tree_error_button) Button moreRetryButton;
    private TreeAdapterListener listener;
    private final String TAG = "TreeBottomViewHolder";

    public TreeBottomViewHolder(View itemView, final TreeAdapterListener listener) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        this.listener = listener;
        setUpViews();
    }

    private void setUpViews() {
        bottomProgress.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor
                (itemView.getContext(), R.color.colorAccent), PorterDuff.Mode.SRC_IN);

        moreRetryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setVisibility(View.GONE);
                listener.onLoadMoreClicked();
            }
        });
    }

    @Override
    public void onResponse(Status status) {
        processViews(status);
    }

    private void processViews(Status status) {
    //  This method is never called
        Log.i(TAG, "onResponse: with status " + status);
        if (status == Status.FAILED) {
            bottomProgress.setVisibility(View.GONE);
            moreRetryButton.setVisibility(View.VISIBLE);

        } else if (status == Status.SUCCESS) {
            bottomProgress.setVisibility(View.GONE);

        } else if (status == Status.PRE_REQUEST) {
            bottomProgress.setVisibility(View.VISIBLE);
        }
    }
}

Фрагмент

private TreeBottomListener bottomListener = bottomCallbacks;

private static TreeBottomListener bottomCallbacks = new TreeBottomListener() {
        @Override
        public void onResponse(Status status) {

        }
    };

// I do this say when a network request is about to be sent
bottomListener.onResponse(TreeBottomListener.Status.PRE_REQUEST);

person X09    schedule 01.03.2017    source источник
comment
Обратитесь к этой ссылке для справки.   -  person vijay chhalotre    schedule 01.03.2017
comment
@vijaychhalotre, спасибо. Я видел это раньше, но я хочу сделать наоборот, т.е. вызвать метод ViewHolder из Fragment/Activity.   -  person X09    schedule 01.03.2017
comment
Вы не должны этого делать. Это сделает ваш код тесно связанным и очень сложным. Задача адаптера должна состоять в том, чтобы отображать элементы в списке или recyclerView. Активность не должна напрямую взаимодействовать с адаптером или ViewHolder. Если вы хотите обновить элементы списка, внесите изменения в список данных адаптера и вызовите метод notifydatasetChange.   -  person nnn    schedule 01.03.2017


Ответы (1)


вы можете вызвать этот метод (YourAdapter.TreeBottomViewHolder)recyclerView.findViewHolderForLayoutPosition(position);, он возвращает ViewHolder, вы можете проверить позицию элемента, используя следующий код:

    private boolean isCurrentListViewItemVisible(int position) {
    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    int first = layoutManager.findFirstVisibleItemPosition();
    int last = layoutManager.findLastVisibleItemPosition();
    return first <= position && position <= last;
}

то вы можете сделать следующее:

TreeBottomViewHolder holder = (YourAdapter.TreeBottomViewHolder)recyclerView.findViewHolderForLayoutPosition(position);

if(isCurrentListViewItemVisible(position)){
    // you can access your views here
}

Я хочу, если это поможет вам.

person mahmoud moustafa    schedule 01.03.2017
comment
По какой-то неизвестной причине он возвращает ноль. - person X09; 01.03.2017
comment
Ничего себе, это было легко исправить, сработало для меня - person Lokesh Surage; 22.07.2021