Просмотр Recycling не происходит с Multiple Recyclerview внутри NestedScrollView

java android android-fragments android-recyclerview android-nestedscrollview

884 просмотра

1 ответ

8241 Репутация автора

Я застрял с проблемой управления многократной Recyclerviewпереработкой внутри NestedScrollView. Позвольте мне рассказать, что я пытаюсь сделать -

  1. У меня есть две структуры кадра, т.е. frame1 и frame2.
  2. У меня есть два фрагмента, содержащих обзор повторного просмотра: обзор повторного просмотра первого фрагмента, показывающий элементы по горизонтали, в то время как просмотр повторного просмотра второго фрагмента, показанный по вертикали.
  3. Теперь я поместил оба FrameLayoutвнутри NestedScroolView, frame1 recyclerview правильно перерабатывает все представления, но frame2 recylerview не перерабатывает представление, не знаете почему? он сначала загружает все элементы, а затем показывает на экране.

Какой-то код:

MainActivity.java

 FragmentTransaction transaction;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentA frag1=new FragmentA();
FragmentB frag2=new FragmentB();
transaction =    getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.frame1, frag1);
    transaction.addToBackStack(frag1.getClass().getName());
    transaction.commit();

 transaction =   getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.frame2, frag2);
    transaction.addToBackStack(frag2.getClass().getName());
    transaction.commit();
}

main.xml

  <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

 <android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
  <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/frame1"
            android:layout_width="match_parent"
            android:layout_height="185dp" />

        <FrameLayout
            android:id="@+id/frame2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
             />

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

Фрагмент А:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v= inflater.inflate(R.layout.recycler_view, container, false);
    mDataListView = (RecyclerView) v.findViewById(R.id.data_list_view);
    mDataListView .setHasFixedSize(true);
    final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), getActivity().getResources().getInteger(R.integer.playlist_categories_columns), GridLayoutManager.VERTICAL, false);

    mDataListView .setNestedScrollingEnabled(false);
   }
    }));


    return v;
}

Фрагмент Б:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v= inflater.inflate(R.layout.recycler_view, container, false);
    mDataListView = (RecyclerView) v.findViewById(R.id.data_list_view);
    mDataListView .setHasFixedSize(true);
     final GridLayoutManager gridLayoutManager = new    GridLayoutManager(getActivity(), 1, GridLayoutManager.HORIZONTAL, false);
    mDataListView .setLayoutManager(gridLayoutManager);

    mDataListView .setNestedScrollingEnabled(false);
   }
    }));


    return v;
}

recycler_view.xml

 <?xml version="1.0" encoding="utf-8"?>
 <android.support.v7.widget.RecyclerView    xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/data_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Я надеюсь, что я ясен с моим вопросом.

Автор: Kapil Rajput Источник Размещён: 18.07.2016 07:22

Ответы (1)


0 плюса

8241 Репутация автора

Решение

Исходя из моего опыта, я обнаружил, что переработка вида невозможна с несколькими recyclerview'sвнутри a NestedScrollView.

Но я придумываю решение, чтобы показать несколько обзоров Recycler в соответствии с моим требованием. Я хочу показать одно горизонтальное представление Recycler сверху и одно вертикальное представление Recycler ниже, так что то, чем я делюсь, я делюсь, может кому-то поможет.

Я удалил NestedScrollViewкак родительский Recyclerview'sи сделал горизонтальный Recyclerviewкак HeaderViewвертикальный Recyclerview.

код:

public class ListHeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
ArrayList<String> data;

public ListHeaderAdapter (ArrayList<String> data) {
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_ITEM) {
        //inflate your layout and pass it to view holder
        return new VHItem(null);
    } else if (viewType == TYPE_HEADER) {
        //inflate your layout and pass it to view holder
        return new VHHeader(null);
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
 int pos = position - 1; // for handling of Header view(use pos to fetch data from list)

    if (holder instanceof VHItem) {
        String dataItem = data.get(pos);
        //cast holder to VHItem and set data
    } else if (holder instanceof VHHeader) {
        //cast holder to VHHeader and set data for header.
    }
}

@Override
public int getItemCount() {
    return data.size()+ 1; // for handling of Header view
}

@Override
public int getItemViewType(int position) {
    if (isHeader(position))
        return TYPE_HEADER;

    return TYPE_ITEM;
}

public boolean isHeader(int position) {
    return position == 0;
}


class VHItem extends RecyclerView.ViewHolder {
    TextView title;

    public VHItem(View itemView) {
        super(itemView);
    }
}

class VHHeader extends RecyclerView.ViewHolder {
    Button button;

    public VHHeader(View itemView) {
        super(itemView);
    }
}
}

Примечание: та же логика может быть реализована для показа горизонтального RecyclerView'sв любом положении

Автор: Kapil Rajput Размещён: 06.01.2017 09:49
Вопросы из категории :
32x32