Использовать RecyclerView внутри ScrollView с гибкой высотой элемента Recycler

Я хочу знать, есть ли возможный способ использования RecyclerView?

до этого я использую RecyclerView с высотой исправления внутри ScrollView, но на этот раз я не знаю высоту элемента.

Подсказка: я прочитал весь вопрос и решение вопроса о стеке, прежде чем задавать этот вопрос с 4 дней назад.

обновление: какое-то решение научится прокручивать RecyclerView самостоятельно, но я хочу показать это расширенное.

Ответ 1

Я ищу ответ на этот вопрос по всему миру, но я не нашел прямого ответа на этот популярный вопрос. Наконец я собрал несколько трюков и решил эту проблему!

Моя проблема начинается, когда мой босс попросил меня использовать RecyclerView внутри ScrollView, и, как вы знаете, мы не можем использовать два прокручиваемых объекта внутри друг друга, за исключением случаев, когда мы устанавливаем или знаем фиксировать высоту элемента для нашего RecyclerView. и это ответ:

Шаг 1: сначала вы должны найти гибкую высоту элемента RecyclerView, и это возможно из вашего RecyclerView > onBindViewHolder

holder.itemView.post(new Runnable() {
        @Override
        public void run() {

            int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically
            int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically

            dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear
        }
    });

с помощью этого кода вы найдете свою высоту элемента по мере их сборки и отправляете высоту элемента в свою активность с помощью интерфейса.

для тех, у кого проблемы с интерфейсом, я оставляю код интерфейса ниже, который должен писать в адаптере.

public interface DynamicHeight {
    void HeightChange (int position, int height);
}

Шаг 2: мы до сих пор находили наш рост, и теперь мы хотим установить высоту для нашего RecyclerView. сначала мы должны вычислить Суммирование высоты элемента. на этом этапе мы делаем это с помощью BitMap сначала реализует последний шаг интерфейс и напишите этот код ниже в Деятельности или Фрагмент, который определяет ваш RecyclerView

@Override
public void HeightChange(int position, int height) {
    itemHeight.put(position, height);
    sumHeight = SumHashItem (itemHeight);

    float density = activity.getResources().getDisplayMetrics().density;
    float viewHeight = sumHeight * density;
    review_recyclerView.getLayoutParams().height = (int) sumHeight;

    int i = review_recyclerView.getLayoutParams().height;
}

int SumHashItem (HashMap<Integer, Integer> hashMap) {
    int sum = 0;

    for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet())  {
        sum += myItem.getValue();
    }

    return sum;
}

Шаг 3: теперь мы суммируем вашу высоту RecyclerView. для последнего шага мы должны просто отправить интерфейс, который мы пишем на последнем шаге для адаптера с некоторым кодом следующим образом:

reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this);

когда вы реализуете интерфейс, вы должны отправить его в свой контекст, который я использую this.

Наслаждайтесь этим

Ответ 2

Если вы хотите просто прокрутить, вы можете использовать NestedScrollView вместо ScrollView. Таким образом, вы можете изменить свой код следующим образом:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

            //design your content here with RecyclerView 

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

Ответ 3

Используйте эту строку в вашем обзоре переработчика:

 android:nestedScrollingEnabled="false"

попробуйте, реселлер-просмотр будет плавно прокручиваться с гибкой высотой

Ответ 4

[RESOLVED] У меня такая же проблема с Horizontal recycleview. Измените Gradle repo для recycleview

 compile 'com.android.support:recyclerview-v7:23.2.1'

Введите это: linearLayoutManager.setAutoMeasureEnabled(true);

Исправлены ошибки, связанные с различными методами измерения в обновлении

Проверить http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

Я нашел проблему с библиотекой 23.2.1: Когда элемент match_parent recycle view заполняет полный элемент для просмотра, всегда используйте min height or "wrap_content".

Спасибо

Ответ 5

Чтобы зафиксировать переход в RecyclerView, вы должны переопределить canScrollVertically в LinearLayoutManager:

linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};

Ответ 6

Если установка фиксированной высоты для RecyclerView не работала для кого-то (например, меня), вот что я добавил к решению фиксированной высоты:

   mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            rv.getParent().requestDisallowInterceptTouchEvent(true);
            break;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

I

Ответ 7

Я полностью согласен с решением Ashkan, большое спасибо (проголосовали +1!), но есть одна вещь...

Если RecyclerView правильно прокручивается внутри ScrollView/NestedScrollView, но он не бросается (перехватывает его), тогда решение должно расширить RecyclerView и переопределить OnInterceptTouchEvent и OnTouchEvent. Если вам не нужны какие-либо действия с кликом, а просто хотите представить элементы с рабочим потоком, просто верните false как в нижеследующем:

public class InterceptingRecyclerView extends RecyclerView {

    public InterceptingRecyclerView(Context context) {
        super(context);
    }

    public InterceptingRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public InterceptingRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }
}

Или на самом деле его следует называть NonIntercepting...;) Простым, как это.

Ответ 8

Я решил эту проблему, используя NestedScrollView вместо ScrollView. И для RecyclerView

    <android.support.v7.widget.RecyclerView 
android:layout_width="match_parent"
  android:layout_height="match_parent" />

И в коде

recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);