Вызов метода из RecyclerView, полученного с использованием отражения - PullRequest
1 голос
/ 17 июня 2019

Мне нужен доступ к методам RecyclerView, созданным с помощью сторонней библиотеки. То, что я делаю, это чтобы заполучил RecyclerView View используя findViewById:

ViewGroup mainView = mainActivity.getWindow().getDecorView().findViewById(android.R.id.content);
    if(feedView == null){
        Object okStreamRecyclerView =  mainView.findViewById(NEWSFEED_RECYCLER_ID);
        feedView = (okStreamRecyclerView.getClass().getSuperclass()).getSuperclass();
        scrollToTop(feedView);
    }

На данный момент feedView.getSimpleName приводит к RecyclerView. Затем я пытаюсь прокрутить RecyclerView наверх, используя:

private void scrollToTop(Class feedView) {
        log("THE VIEW IS OF TYPE: "+feedView.getName()); // androidx.recyclerview.widget.RecyclerView
        try {
            Method method = feedView.getMethod("getLayoutManager");
            method.setAccessible(true);
            LinearLayoutManager layoutManager = (LinearLayoutManager) method.invoke(feedView);
            layoutManager.scrollToPositionWithOffset(0, 0);
        } catch (NoSuchMethodException e) {
           log("NO SUCH METHOD EXCEPTION",e);
        } catch (IllegalAccessException e) {
            log("ILLEGAL ACCESS EXCEPTION",e);
        } catch (InvocationTargetException e) {
            log("INVOCATION TARGET EXCEPTION",e);
        }
    }

но по какой-то причине я получаю ошибку ниже:

IllegalArgumentException: Expected receiver of type androidx.recyclerview.widget.RecyclerView, but got java.lang.Class<androidx.recyclerview.widget.RecyclerView>

Как я могу преобразовать класс в ожидаемый RecyclerView? Есть ли другой способ получить это представление?

1 Ответ

0 голосов
/ 24 июня 2019

Благодаря подсказке @CommonsWare мне удалось вызвать метод ScrollToPosition с помощью отражения. Вот рабочий код в моем конкретном случае, может быть проще в другом сценарии:

View okStreamRecyclerView = null;
            try {
                okStreamRecyclerView = mainView.findViewById(NEWSFEED_RECYCLER_ID);
                feedView = (okStreamRecyclerView.getClass().getSuperclass()).getSuperclass();
                Method method = feedView.getMethod("getLayoutManager");
                method.setAccessible(true);
                LinearLayoutManager layoutManager = (LinearLayoutManager) method.invoke(okStreamRecyclerView);
                Class llm = layoutManager.getClass().getSuperclass();
                Method m2 = llm.getMethod("scrollToPositionWithOffset",int.class, int.class);
                m2.setAccessible(true);
                m2.invoke(layoutManager,0,0);
            } catch (ClassCastException e){
                log("AN EXECPTON OCCURED WHILE FETCHING VIEW",e);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...