Чтобы избежать смешанного макета при прокрутке, вы должны использовать ViewFlipper
с тремя различными RecyclerView, что означает RecyclerView для каждого макета.
Шаг 1:
- Создание общедоступного перечисления для трех макетов
public enum ViewType {
CARD_LIST_LAYOUT, TITLE_LAYOUT, CARD_MAGAZINE_LAYOUT;
}
- В PostAdapter создайте переменную
ViewType
и передайте ее в конструктор, и проверьте через if & else на onCreateViewHolder
, чтобы узнать, какой макет выбран
PostAdapter(Context context, List<Item> items, ViewType viewType) {
this.context = context;
this.items = items;
this.viewType = viewType;
}
@NonNull
@Override
public PostAdapter.PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View cardListLayout = inflater.inflate(R.layout.post_item_card_layout, parent, false);
View titleLayout = inflater.inflate(R.layout.post_item_grid_layout, parent, false);
View cardMagazineLayout = inflater.inflate(R.layout.card_magazine_layout, parent, false);
if (this.viewType == ViewType.TITLE_LAYOUT) {
return new PostViewHolder(titleLayout);
} else if (this.viewType == ViewType.CARD_LIST_LAYOUT) {
return new PostViewHolder(cardListLayout);
} else {
return new PostViewHolder(cardMagazineLayout);
}
}
Шаг 2:
- Создайте
ViewFlipper
в классе, который содержит основной RecyclerView, с тремя дочерними Layout's и RecyclerView's
<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/titleRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/cardRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/cardMagazineRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
</RelativeLayout>
</ViewFlipper>
- В MainActivity определить переменные как это
viewFlipper = ((ViewFlipper) findViewById(R.id.parentLayout));
titleRecyclerView = (RecyclerView) findViewById(R.id.titleRecyclerView);
cardRecyclerView = (RecyclerView) findViewById(R.id.cardRecyclerView);
cardMagazineRecyclerView = (RecyclerView) findViewById(R.id.cardMagazineRecyclerView);
linearLayoutManager1 = new LinearLayoutManager(this);
cardRecyclerView.setLayoutManager(linearLayoutManager1);
linearLayoutManager2 = new LinearLayoutManager(this);
cardMagazineRecyclerView.setLayoutManager(linearLayoutManager2);
gridLayoutManager = new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false);
titleRecyclerView.setLayoutManager(gridLayoutManager);
adapter1 = new PostAdapter(this, items, ViewType.TITLE_LAYOUT);
titleRecyclerView.setAdapter(adapter1);
adapter2 = new PostAdapter(this, items, ViewType.CARD_LIST_LAYOUT);
cardRecyclerView.setAdapter(adapter2);
adapter3 = new PostAdapter(this, items, ViewType.CARD_MAGAZINE_LAYOUT);
cardMagazineRecyclerView.setAdapter(adapter3);
- добавить
ScrollListener
для каждого RecyclerView
titleRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
}
}
});
cardRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
}
}
});
cardMagazineRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
}
}
});
Шаг 3:
- И, наконец,
onOptionsItemSelected
переключение между тремя раскладками при нажатии
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.change_layout) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.choose_layout));
String[] layouts = {"Title Layout", "Cards List", "Card Magazine Layout"};
builder.setItems(layouts, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int index) {
switch (index) {
case 0: // Title layout
viewFlipper.setDisplayedChild(0);
break;
case 1: // Cards List Layout
viewFlipper.setDisplayedChild(1);
break;
case 2: // Cards Magazine Layout
viewFlipper.setDisplayedChild(2);
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
return true;
}
[Важное примечание]
Вы должны выполнять любую реализацию старого основного RecyclerView по три раза для каждого макета или RecyclerView, как в приведенном выше примере ScrollListener
.
Надеюсь, что это работает с вами, и, пожалуйста, сообщите мне, если у вас есть какие-либо вопросы