单击 AlertDialog 项目列表时在 RecyclerView 布局之间切换
Switch between RecyclerView layouts when click on AlertDialog item list
我有三种不同的布局 cardsListLayout
, titleLayout
, cardMagazineLayout
将来可能会有更多,用作 onCreateViewHolder
方法的视图。
我想在 onCreateViewHolder
方法中的视图之间切换,以便当用户从 AlertDialog 列表中选择时
这个onOptionsItemSelected在MainActivity里面有menu Item的地方"change the layout"这样当用户按下它的时候就会出现AlertDialog list
@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
Toast.makeText(MainActivity.this,
"Title layout", Toast.LENGTH_LONG).show();
break;
case 1: // Cards List
Toast.makeText(MainActivity.this,
"Card list", Toast.LENGTH_LONG).show();
break;
case 2: // Cards Magazine Layout
Toast.makeText(MainActivity.this,
"Card Magazine Layout", Toast.LENGTH_LONG).show();
}
}
});
这是我的自定义适配器 class PostAdapter
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
private Context context;
private List<Item> items;
public PostAdapter(Context context, List<Item> items) {
this.context = context;
this.items = items;
}
@NonNull
@Override
public PostAdapter.PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
// here's the three layouts that I can't switch between it
View cardsListLayout = 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);
return new PostViewHolder(titleLayout);
}
@Override
public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
final Item item = items.get(position);
holder.postTitle.setText(item.getTitle());
final Document document = Jsoup.parse(item.getContent());
Elements elements = document.select("img");
Log.e("CODE", "Image: " + elements.get(0).attr("src"));
// Log.d("Text",document.text());
// holder.postDescription.setText(document.text());
Glide.with(context).load(elements.get(0).attr("src"))
.into(holder.postImage);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, DetailsActivity.class);
intent.putExtra("url", item.getUrl());
intent.putExtra("title", item.getTitle());
intent.putExtra("content", item.getContent());
int youtubeThumbnailImagesetVisibility = 0;
Element element = document.body();
String youtubeThumbnailImageSrc = "";
String youTubeLink = "";
for (Element e : element.getElementsByClass
("YOUTUBE-iframe-video")) {
youtubeThumbnailImageSrc = e.attr("data-thumbnail-src");
youTubeLink = e.attr("src");
Log.e("YouTube thumbnail", youtubeThumbnailImageSrc);
Log.e("Youtube link", youTubeLink);
}
if (youtubeThumbnailImageSrc.isEmpty()) {
youtubeThumbnailImagesetVisibility = 8;
intent.putExtra("youtubeThumbnailImagesetVisibility",
youtubeThumbnailImagesetVisibility);
} else {
intent.putExtra("youtubeThumbnailImageSrc", youtubeThumbnailImageSrc);
intent.putExtra("youTubeLink", youTubeLink);
}
// String imageSrc = elements.get(0).attr("src");
// intent.putExtra("blogImage",imageSrc);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class PostViewHolder extends RecyclerView.ViewHolder {
ImageView postImage;
TextView postTitle;
TextView postDescription;
public PostViewHolder(View itemView) {
super(itemView);
postImage = itemView.findViewById(R.id.postImage);
postTitle = itemView.findViewById(R.id.postTitle);
postDescription = itemView.findViewById(R.id.postDescription);
}
}
}
我为每个创建了两个不同的布局管理器,有一个 LinearLayoutManager 和 GridLayoutManager,目前我使用的是 GridLayout 所以我暂时评论了 LinearLayoutManger 直到我知道如何在它们之间切换
// linearLayoutManager = new LinearLayoutManager(this);
gridLayoutManager = new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false);
// recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setLayoutManager(gridLayoutManager);
我向往的结果
您可以通过在您的适配器中实现 VIEW_TYPE 来简单地实现这一点。 RecyclerView Adapter中有一个被重写的方法public int getViewType(int position)
,一般该方法用于将各种类型的视图混合到一个RecyclerView中。
但是你也可以在你的情况下使用它。首先定义视图类型的枚举。然后在您的适配器内部维护一个变量来存储当前的 viewType,从警报对话框项单击相应地更新该变量。
在您的 onCreateViewHolder
和 onBindViewHolder
方法中使用当前的 viewType 值来确定您当前应该使用的布局以及现在需要更新的 UI 元素。还可以通过单击时的警报对话框项目更新 RecyclerView 布局管理器。
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
public enum ViewType {
VIEW_TYPE_GRID, VIEW_TYPE_CARD, VIEW_TYPE_CARD_MAGAZINE
}
private Context context;
private List<Item> items;
private ViewType currentViewType;
public PostAdapter(Context context, List<Item> items, ViewType viewType) {
this.context = context;
this.items = items;
this.currentViewType = viewType;
}
// Call this method from alert dialog item click.
public void updateViewType(ViewType type) {
this.currentViewType = type;
}
@Override
public int getItemViewType(int position) {
return this.currentViewType.ordinal();
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public PostAdapter.PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
// here's the layouts that you want to switch between, based on the viewType
if (viewType == ViewType.VIEW_TYPE_CARD.ordinal()) {
View cardLayout = inflater.inflate(R.layout. post_item_card_layout, parent, false);
return new PostViewHolder(cardLayout);
}
else if (viewType == ViewType.VIEW_TYPE_GRID.ordinal()) {
View gridLayout = inflater.inflate(R.layout. post_item_grid_layout,parent,false);
return new PostViewHolder(gridLayout);
}
else {
View cardMagazineLayout = inflater.inflate(R.layout. card_magazine_layout, parent, false);
return new PostViewHolder(cardMagazineLayout);
}
}
@Override
public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
final Item item = items.get(position);
// Similarly handle different view layout items here based on the viewType returned from getItemViewType method.
if (getItemViewType(position) == ViewType.VIEW_TYPE_CARD.ordinal()) {
} else if (getItemViewType(position) == ViewType.VIEW_TYPE_GRID.ordinal()) {
} else {
}
}
}
更新:每次调用 updateViewType
方法时,您还需要像这样调用 notifyDataSetChanged
方法:
mAdapter.updateViewType(PostAdapter.ViewType.VIEW_TYPE_GRID);
mAdapter.notifyDataSetChanged()
*** 我已经在我的设备上测试了这段代码,它按预期工作。请注意,在展开布局和使用 TextView 和 ImageView 等布局元素时,您应该小心处理 VIEW_TYPE。在我之前的回答中,我混淆了视图类型和错误的布局,这可能是您看到混合布局作为输出的唯一原因。
*** 此外,getItemViewType
方法被错误地重命名为 getViewType
,这是我的代码中导致混合输出的另一个罪魁祸首。
为了防止滚动时出现混合布局,您应该使用 ViewFlipper
和三个不同的 RecyclerView,这意味着每个布局都有 RecyclerView。
第 1 步:
- 为三种布局创建一个 public 枚举
public enum ViewType {
CARD_LIST_LAYOUT, TITLE_LAYOUT, CARD_MAGAZINE_LAYOUT;
}
- 在 PostAdapter 中创建一个
ViewType
变量并将其传递给构造函数,并在 onCreateViewHolder
上通过 if & else 检查以了解选择了哪种布局
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 步:
- 在包含主 RecyclerView 的
ViewFlipper
中创建一个 ViewFlipper
,其中包含三个子布局和 RecyclerView
<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);
- 为每个 RecyclerView 添加
ScrollListener
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
.
的示例
希望与您合作,如果您有任何疑问,请告诉我
不要再做了。只需在警报对话框单击时更改 recyclerview 的布局。如果你想使用网格布局而不是将其更改为网格布局,LinearLayout 并设置 adapter.notifydatasetchanged,如果你想更改 recyclerview 适配器行的布局而不是将参数化构造函数添加到适配器 recyclerview.After即根据that.like这个
读取参数和设置视图
public CategoryRecyclerview(List<MainCategory> mainCategories, Context context, FragmentManager fragmentManager,String layouttype) {
this.context = context;
layouttype= this.layouttype;}
并在 oncreateviewholder 中放入这个
if(layouttype.equals("GRID")){
View view = inflater.inflate(R.layout.grid, viewGroup, false);
CategoryRecyclerview.Myviewholder viewHolder = new CategoryRecyclerview.Myviewholder(view);
holders.add(viewHolder);
return viewHolder;
}
通知数据集更改后。
不需要为此使用多个Recyclerview
您可以使用单个 Recyclerview
和 Multiple viewType
来实现此目的
如果您想更改 Recyclerview
的布局,只需更改 Recyclerview
的 LayoutManager
和 viewType
即可
示例代码
试试这个方法
首先为您的多视图类型创建一个三布局
grid_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="150dp"
android:layout_height="150dp"
app:cardElevation="10dp"
app:cardUseCompatPadding="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/dishu" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#6a000000"
android:gravity="center"
android:padding="10dp"
android:text="dummy text"
android:textColor="@android:color/white" />
</RelativeLayout>
</android.support.v7.widget.CardView>
cardlist_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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"
app:cardElevation="10dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/dishu" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="10dp"
android:text="Dummy Title"
android:textColor="@android:color/black"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="10dp"
android:text="Dummy Tex" />
</LinearLayout>
</android.support.v7.widget.CardView>
title_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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"
app:cardElevation="10dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="dummy text"
android:textColor="@android:color/black"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="I have three different layouts cardsListLayout , titleLayout , cardMagazineLayoutand there may be more in the future, which used as a views on onCreateViewHolder method." />
</LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="150dp"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/dishu" />
</LinearLayout>
</android.support.v7.widget.CardView>
DataAdapter
package neel.com.recyclerviewdemo;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class DataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int ITEM_TYPE_GRID = 0;
public static final int ITEM_TYPE_CARD_LIST = 1;
public static final int ITEM_TYPE_TITLE_LIST = 2;
private Context mContext;
private int VIEW_TYPE = 0;
public DataAdapter(Context mContext) {
this.mContext = mContext;
}
public void setVIEW_TYPE(int viewType) {
VIEW_TYPE = viewType;
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = null;
// check here the viewType and return RecyclerView.ViewHolder based on view type
switch (VIEW_TYPE) {
case ITEM_TYPE_GRID:
// if VIEW_TYPE is Grid than return GridViewHolder
view = LayoutInflater.from(mContext).inflate(R.layout.grid_layout, parent, false);
return new GridViewHolder(view);
case ITEM_TYPE_CARD_LIST:
// if VIEW_TYPE is Card List than return CardListViewHolder
view = LayoutInflater.from(mContext).inflate(R.layout.cardlist_layout, parent, false);
return new CardListViewHolder(view);
case ITEM_TYPE_TITLE_LIST:
// if VIEW_TYPE is Title List than return TitleListViewHolder
view = LayoutInflater.from(mContext).inflate(R.layout.title_layout, parent, false);
return new TitleListViewHolder(view);
}
return new GridViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
final int itemType = getItemViewType(position);
// First check here the View Type
// than set data based on View Type to your recyclerview item
if (itemType == ITEM_TYPE_GRID) {
if (holder instanceof CardViewHolder) {
GridViewHolder viewHolder = (GridViewHolder) holder;
// write here code for your grid list
}
} else if (itemType == ITEM_TYPE_CARD_LIST) {
if (holder instanceof CardViewHolder) {
CardListViewHolder buttonViewHolder = (CardListViewHolder) holder;
// write here code for your grid list
}
} else if (itemType == ITEM_TYPE_TITLE_LIST) {
if (holder instanceof CardViewHolder) {
TitleListViewHolder buttonViewHolder = (TitleListViewHolder) holder;
// write here code for your TitleListViewHolder
}
}
}
@Override
public int getItemCount() {
return 40;
}
// RecyclerView.ViewHolder class for gridLayoutManager
public class GridViewHolder extends RecyclerView.ViewHolder {
public GridViewHolder(@NonNull View itemView) {
super(itemView);
}
}
// RecyclerView.ViewHolder class for Card list View
public class CardListViewHolder extends RecyclerView.ViewHolder {
public CardListViewHolder(@NonNull View itemView) {
super(itemView);
}
}
// RecyclerView.ViewHolder class for Title list View
public class TitleListViewHolder extends RecyclerView.ViewHolder {
public TitleListViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
MainActivity
package neel.com.recyclerviewdemo;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
DataAdapter dataAdapter;
private RecyclerView myRecyclerView;
private LinearLayoutManager linearLayoutManager;
private GridLayoutManager gridLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myRecyclerView = findViewById(R.id.myRecyclerView);
myRecyclerView.setHasFixedSize(true);
linearLayoutManager = new LinearLayoutManager(this);
gridLayoutManager = new GridLayoutManager(this, 3);
myRecyclerView.setLayoutManager(gridLayoutManager);
dataAdapter = new DataAdapter(this);
myRecyclerView.setAdapter(dataAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.home_menu, menu);
// return true so that the menu pop up is opened
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_dialog) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Please choose a layout");
String[] layouts = {"Title Layout", "Cards List", "Grid View"};
builder.setItems(layouts, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int index) {
switch (index) {
case 0: // Title layout
dataAdapter.setVIEW_TYPE(2);
myRecyclerView.setLayoutManager(linearLayoutManager);
myRecyclerView.setAdapter(dataAdapter);
break;
case 1: // Cards List
dataAdapter.setVIEW_TYPE(1);
myRecyclerView.setLayoutManager(linearLayoutManager);
myRecyclerView.setAdapter(dataAdapter);
break;
case 2: // Grid Layout
dataAdapter.setVIEW_TYPE(0);
myRecyclerView.setLayoutManager(gridLayoutManager);
myRecyclerView.setAdapter(dataAdapter);
}
}
});
builder.show();
}
return super.onOptionsItemSelected(item);
}
}
activity_main layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/myRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
输出
我有三种不同的布局 cardsListLayout
, titleLayout
, cardMagazineLayout
将来可能会有更多,用作 onCreateViewHolder
方法的视图。
我想在 onCreateViewHolder
方法中的视图之间切换,以便当用户从 AlertDialog 列表中选择时
这个onOptionsItemSelected在MainActivity里面有menu Item的地方"change the layout"这样当用户按下它的时候就会出现AlertDialog list
@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
Toast.makeText(MainActivity.this,
"Title layout", Toast.LENGTH_LONG).show();
break;
case 1: // Cards List
Toast.makeText(MainActivity.this,
"Card list", Toast.LENGTH_LONG).show();
break;
case 2: // Cards Magazine Layout
Toast.makeText(MainActivity.this,
"Card Magazine Layout", Toast.LENGTH_LONG).show();
}
}
});
这是我的自定义适配器 class PostAdapter
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
private Context context;
private List<Item> items;
public PostAdapter(Context context, List<Item> items) {
this.context = context;
this.items = items;
}
@NonNull
@Override
public PostAdapter.PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
// here's the three layouts that I can't switch between it
View cardsListLayout = 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);
return new PostViewHolder(titleLayout);
}
@Override
public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
final Item item = items.get(position);
holder.postTitle.setText(item.getTitle());
final Document document = Jsoup.parse(item.getContent());
Elements elements = document.select("img");
Log.e("CODE", "Image: " + elements.get(0).attr("src"));
// Log.d("Text",document.text());
// holder.postDescription.setText(document.text());
Glide.with(context).load(elements.get(0).attr("src"))
.into(holder.postImage);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, DetailsActivity.class);
intent.putExtra("url", item.getUrl());
intent.putExtra("title", item.getTitle());
intent.putExtra("content", item.getContent());
int youtubeThumbnailImagesetVisibility = 0;
Element element = document.body();
String youtubeThumbnailImageSrc = "";
String youTubeLink = "";
for (Element e : element.getElementsByClass
("YOUTUBE-iframe-video")) {
youtubeThumbnailImageSrc = e.attr("data-thumbnail-src");
youTubeLink = e.attr("src");
Log.e("YouTube thumbnail", youtubeThumbnailImageSrc);
Log.e("Youtube link", youTubeLink);
}
if (youtubeThumbnailImageSrc.isEmpty()) {
youtubeThumbnailImagesetVisibility = 8;
intent.putExtra("youtubeThumbnailImagesetVisibility",
youtubeThumbnailImagesetVisibility);
} else {
intent.putExtra("youtubeThumbnailImageSrc", youtubeThumbnailImageSrc);
intent.putExtra("youTubeLink", youTubeLink);
}
// String imageSrc = elements.get(0).attr("src");
// intent.putExtra("blogImage",imageSrc);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class PostViewHolder extends RecyclerView.ViewHolder {
ImageView postImage;
TextView postTitle;
TextView postDescription;
public PostViewHolder(View itemView) {
super(itemView);
postImage = itemView.findViewById(R.id.postImage);
postTitle = itemView.findViewById(R.id.postTitle);
postDescription = itemView.findViewById(R.id.postDescription);
}
}
}
我为每个创建了两个不同的布局管理器,有一个 LinearLayoutManager 和 GridLayoutManager,目前我使用的是 GridLayout 所以我暂时评论了 LinearLayoutManger 直到我知道如何在它们之间切换
// linearLayoutManager = new LinearLayoutManager(this);
gridLayoutManager = new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false);
// recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setLayoutManager(gridLayoutManager);
我向往的结果
您可以通过在您的适配器中实现 VIEW_TYPE 来简单地实现这一点。 RecyclerView Adapter中有一个被重写的方法public int getViewType(int position)
,一般该方法用于将各种类型的视图混合到一个RecyclerView中。
但是你也可以在你的情况下使用它。首先定义视图类型的枚举。然后在您的适配器内部维护一个变量来存储当前的 viewType,从警报对话框项单击相应地更新该变量。
在您的 onCreateViewHolder
和 onBindViewHolder
方法中使用当前的 viewType 值来确定您当前应该使用的布局以及现在需要更新的 UI 元素。还可以通过单击时的警报对话框项目更新 RecyclerView 布局管理器。
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
public enum ViewType {
VIEW_TYPE_GRID, VIEW_TYPE_CARD, VIEW_TYPE_CARD_MAGAZINE
}
private Context context;
private List<Item> items;
private ViewType currentViewType;
public PostAdapter(Context context, List<Item> items, ViewType viewType) {
this.context = context;
this.items = items;
this.currentViewType = viewType;
}
// Call this method from alert dialog item click.
public void updateViewType(ViewType type) {
this.currentViewType = type;
}
@Override
public int getItemViewType(int position) {
return this.currentViewType.ordinal();
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public PostAdapter.PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
// here's the layouts that you want to switch between, based on the viewType
if (viewType == ViewType.VIEW_TYPE_CARD.ordinal()) {
View cardLayout = inflater.inflate(R.layout. post_item_card_layout, parent, false);
return new PostViewHolder(cardLayout);
}
else if (viewType == ViewType.VIEW_TYPE_GRID.ordinal()) {
View gridLayout = inflater.inflate(R.layout. post_item_grid_layout,parent,false);
return new PostViewHolder(gridLayout);
}
else {
View cardMagazineLayout = inflater.inflate(R.layout. card_magazine_layout, parent, false);
return new PostViewHolder(cardMagazineLayout);
}
}
@Override
public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
final Item item = items.get(position);
// Similarly handle different view layout items here based on the viewType returned from getItemViewType method.
if (getItemViewType(position) == ViewType.VIEW_TYPE_CARD.ordinal()) {
} else if (getItemViewType(position) == ViewType.VIEW_TYPE_GRID.ordinal()) {
} else {
}
}
}
更新:每次调用 updateViewType
方法时,您还需要像这样调用 notifyDataSetChanged
方法:
mAdapter.updateViewType(PostAdapter.ViewType.VIEW_TYPE_GRID);
mAdapter.notifyDataSetChanged()
*** 我已经在我的设备上测试了这段代码,它按预期工作。请注意,在展开布局和使用 TextView 和 ImageView 等布局元素时,您应该小心处理 VIEW_TYPE。在我之前的回答中,我混淆了视图类型和错误的布局,这可能是您看到混合布局作为输出的唯一原因。
*** 此外,getItemViewType
方法被错误地重命名为 getViewType
,这是我的代码中导致混合输出的另一个罪魁祸首。
为了防止滚动时出现混合布局,您应该使用 ViewFlipper
和三个不同的 RecyclerView,这意味着每个布局都有 RecyclerView。
第 1 步:
- 为三种布局创建一个 public 枚举
public enum ViewType {
CARD_LIST_LAYOUT, TITLE_LAYOUT, CARD_MAGAZINE_LAYOUT;
}
- 在 PostAdapter 中创建一个
ViewType
变量并将其传递给构造函数,并在onCreateViewHolder
上通过 if & else 检查以了解选择了哪种布局
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 步:
- 在包含主 RecyclerView 的
ViewFlipper
中创建一个ViewFlipper
,其中包含三个子布局和 RecyclerView
<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);
- 为每个 RecyclerView 添加
ScrollListener
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
.
希望与您合作,如果您有任何疑问,请告诉我
不要再做了。只需在警报对话框单击时更改 recyclerview 的布局。如果你想使用网格布局而不是将其更改为网格布局,LinearLayout 并设置 adapter.notifydatasetchanged,如果你想更改 recyclerview 适配器行的布局而不是将参数化构造函数添加到适配器 recyclerview.After即根据that.like这个
读取参数和设置视图 public CategoryRecyclerview(List<MainCategory> mainCategories, Context context, FragmentManager fragmentManager,String layouttype) {
this.context = context;
layouttype= this.layouttype;}
并在 oncreateviewholder 中放入这个
if(layouttype.equals("GRID")){
View view = inflater.inflate(R.layout.grid, viewGroup, false);
CategoryRecyclerview.Myviewholder viewHolder = new CategoryRecyclerview.Myviewholder(view);
holders.add(viewHolder);
return viewHolder;
}
通知数据集更改后。
不需要为此使用多个Recyclerview
您可以使用单个 Recyclerview
和 Multiple viewType
如果您想更改 Recyclerview
的布局,只需更改 Recyclerview
的 LayoutManager
和 viewType
即可
示例代码
试试这个方法
首先为您的多视图类型创建一个三布局
grid_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="150dp"
android:layout_height="150dp"
app:cardElevation="10dp"
app:cardUseCompatPadding="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/dishu" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#6a000000"
android:gravity="center"
android:padding="10dp"
android:text="dummy text"
android:textColor="@android:color/white" />
</RelativeLayout>
</android.support.v7.widget.CardView>
cardlist_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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"
app:cardElevation="10dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/dishu" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="10dp"
android:text="Dummy Title"
android:textColor="@android:color/black"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="10dp"
android:text="Dummy Tex" />
</LinearLayout>
</android.support.v7.widget.CardView>
title_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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"
app:cardElevation="10dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="dummy text"
android:textColor="@android:color/black"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="I have three different layouts cardsListLayout , titleLayout , cardMagazineLayoutand there may be more in the future, which used as a views on onCreateViewHolder method." />
</LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="150dp"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/dishu" />
</LinearLayout>
</android.support.v7.widget.CardView>
DataAdapter
package neel.com.recyclerviewdemo;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class DataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int ITEM_TYPE_GRID = 0;
public static final int ITEM_TYPE_CARD_LIST = 1;
public static final int ITEM_TYPE_TITLE_LIST = 2;
private Context mContext;
private int VIEW_TYPE = 0;
public DataAdapter(Context mContext) {
this.mContext = mContext;
}
public void setVIEW_TYPE(int viewType) {
VIEW_TYPE = viewType;
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = null;
// check here the viewType and return RecyclerView.ViewHolder based on view type
switch (VIEW_TYPE) {
case ITEM_TYPE_GRID:
// if VIEW_TYPE is Grid than return GridViewHolder
view = LayoutInflater.from(mContext).inflate(R.layout.grid_layout, parent, false);
return new GridViewHolder(view);
case ITEM_TYPE_CARD_LIST:
// if VIEW_TYPE is Card List than return CardListViewHolder
view = LayoutInflater.from(mContext).inflate(R.layout.cardlist_layout, parent, false);
return new CardListViewHolder(view);
case ITEM_TYPE_TITLE_LIST:
// if VIEW_TYPE is Title List than return TitleListViewHolder
view = LayoutInflater.from(mContext).inflate(R.layout.title_layout, parent, false);
return new TitleListViewHolder(view);
}
return new GridViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
final int itemType = getItemViewType(position);
// First check here the View Type
// than set data based on View Type to your recyclerview item
if (itemType == ITEM_TYPE_GRID) {
if (holder instanceof CardViewHolder) {
GridViewHolder viewHolder = (GridViewHolder) holder;
// write here code for your grid list
}
} else if (itemType == ITEM_TYPE_CARD_LIST) {
if (holder instanceof CardViewHolder) {
CardListViewHolder buttonViewHolder = (CardListViewHolder) holder;
// write here code for your grid list
}
} else if (itemType == ITEM_TYPE_TITLE_LIST) {
if (holder instanceof CardViewHolder) {
TitleListViewHolder buttonViewHolder = (TitleListViewHolder) holder;
// write here code for your TitleListViewHolder
}
}
}
@Override
public int getItemCount() {
return 40;
}
// RecyclerView.ViewHolder class for gridLayoutManager
public class GridViewHolder extends RecyclerView.ViewHolder {
public GridViewHolder(@NonNull View itemView) {
super(itemView);
}
}
// RecyclerView.ViewHolder class for Card list View
public class CardListViewHolder extends RecyclerView.ViewHolder {
public CardListViewHolder(@NonNull View itemView) {
super(itemView);
}
}
// RecyclerView.ViewHolder class for Title list View
public class TitleListViewHolder extends RecyclerView.ViewHolder {
public TitleListViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
MainActivity
package neel.com.recyclerviewdemo;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
DataAdapter dataAdapter;
private RecyclerView myRecyclerView;
private LinearLayoutManager linearLayoutManager;
private GridLayoutManager gridLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myRecyclerView = findViewById(R.id.myRecyclerView);
myRecyclerView.setHasFixedSize(true);
linearLayoutManager = new LinearLayoutManager(this);
gridLayoutManager = new GridLayoutManager(this, 3);
myRecyclerView.setLayoutManager(gridLayoutManager);
dataAdapter = new DataAdapter(this);
myRecyclerView.setAdapter(dataAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.home_menu, menu);
// return true so that the menu pop up is opened
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_dialog) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Please choose a layout");
String[] layouts = {"Title Layout", "Cards List", "Grid View"};
builder.setItems(layouts, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int index) {
switch (index) {
case 0: // Title layout
dataAdapter.setVIEW_TYPE(2);
myRecyclerView.setLayoutManager(linearLayoutManager);
myRecyclerView.setAdapter(dataAdapter);
break;
case 1: // Cards List
dataAdapter.setVIEW_TYPE(1);
myRecyclerView.setLayoutManager(linearLayoutManager);
myRecyclerView.setAdapter(dataAdapter);
break;
case 2: // Grid Layout
dataAdapter.setVIEW_TYPE(0);
myRecyclerView.setLayoutManager(gridLayoutManager);
myRecyclerView.setAdapter(dataAdapter);
}
}
});
builder.show();
}
return super.onOptionsItemSelected(item);
}
}
activity_main layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/myRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
输出