此时我创建了一个android项目, 其中,点击导航菜单中的项目>>一项活动应该开放。
该活动包含recyclerview。 但我想做的是, 我还有2个布局 1)introduction_layout.xml(在cardview中包含>> 1 textview) 2)implementation_layout.xml(在cardview中包含>> 2个textviews)
并且,在该活动中,我实现了一个底部导航视图 如,
<android.support.design.widget.BottomNavigationView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_menu"
android:layout_marginTop="16dp"
android:layout_alignParentBottom="true"
android:id="@+id/bottomMenu"
android:background="#ffffff"/>
包含2个菜单, 1)介绍 2)执行
所以我想要的是,当用户点击简介时,活动应该在recycler视图中加载introduction_layout.xml 当用户点击实现时,活动应该加载,implementation_layout.xml。
在这里,我有一些基本的想法,我必须在Recycler适配器中使用viewtype。 我也谷歌。但没有任何帮助我达到预期的输出。
请有人帮助我, 目前我只有一个布局文件的回收器适配器。
public class RecyclerAdapter1 extends RecyclerView.Adapter<RecyclerAdapter1.ViewHolder> {
private String[] titles = {"Item one details",
"Item two details", "Item three details",
"Item four details", "Item file details",
"Item six details", "Item seven details",
"Item eight details"};
class ViewHolder extends RecyclerView.ViewHolder{
public TextView itemTitle;
public ViewHolder(View itemView) {
super(itemView);
itemTitle = (TextView)itemView.findViewById(R.id.introText);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.introduction_layout, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.itemTitle.setText(titles[i]);
}
@Override
public int getItemCount() {
return titles.length;
}
}
但是如何为第二个布局文件创建适配器。 以及如何调用该适配器来设置回收器视图? 因为,我正在更新菜单项单击上的布局 表示在单击特定菜单后,应打开所需的布局文件...
这里有一些关于我的项目的更多信息: 1)我的Recycler视图位于nestedscrolview之间 如,
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="fill_parent"
.....
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" />
</android.support.v4.widget.NestedScrollView>
我管理了所需的布局,在按钮点击时打开,
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id=item.getItemId();
if(id==R.id.b1)
{
NestedScrollView scroll = (NestedScrollView) findViewById(R.id.scroll);
scroll.removeAllViews();
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.introduction_layout, null);
scroll.addView(view);
}
else if(id==R.id.b2)
{....}
else if(id==R.id.b3)
{....}
答案 0 :(得分:1)
您应该可以使用视图类型执行此操作。
RecyclerView.Adapter
支持不同视图类型的概念,因此列表中的项目可以有不同的视图。
首先,您需要两个不同的视图持有者类。我假设两个视图上的介绍文本是相同的,因此实现视图持有者可以扩展介绍视图持有者。如果它们非常不同,它们都可以扩展抽象基本视图持有者类。
static class IntroductionViewHolder extends RecyclerView.ViewHolder {
public TextView itemTitle;
public ViewHolder(View itemView) {
super(itemView);
itemTitle = (TextView)itemView.findViewById(R.id.introText);
}
}
static class ImplementationViewHolder extends IntroductionViewHolder {
public TextView implText;
public ViewHolder(View itemView) {
super(itemView);
implText= (TextView)itemView.findViewById(R.id.implText);
}
}
您需要覆盖getItemViewType
。这就是告诉适配器哪个视图持有者用于哪个位置的方法。如果要一次更改所有视图,那么您的适配器可以只有一个当前视图类型字段:
public static final int INTRODUCTION_VIEW_TYPE = 0;
public static final int IMPLEMENTATION_VIEW_TYPE = 1;
private int currentViewType;
然后使用它来切换视图持有者:
@Override
int getItemViewType(int position) {
return currentViewType;
}
您需要一种方法来改变这种情况:
void setCurrentViewType(int currentViewType) {
this.currentViewType = currentViewType;
notifyDataSetChanged();
}
现在,当用户点击BottomNavigationView
时,您可以调用此适配器方法。
然后您的onCreateViewHolder
覆盖如下所示:
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType) {
case INTRODUCTION_VIEW_TYPE:
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.introduction_layout, viewGroup, false);
IntroductionViewHolder viewHolder = new IntroductionViewHolder(v);
return viewHolder;
case IMPLEMENTATION_VIEW_TYPE:
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.implementation_layout, viewGroup, false);
ImplementationViewHolder viewHolder = new ImplementationViewHolder(v);
return viewHolder;
}
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case INTRODUCTION_VIEW_TYPE:
IntroductionViewHolder introductionViewHolder =
(IntroductionViewHolder) viewHolder;
introductionViewHolder.itemTitle.setText(titles[position]);
break;
case IMPLEMENTATION_VIEW_TYPE:
ImplementationViewHolder implementationViewHolder =
(ImplementationViewHolder) viewHolder;
implementationViewHolder.itemTitle.setText(titles[position]);
// or do whatever else you need to do for implementation view
break;
}
}