gpt4 book ai didi

android - 在多个布局文件-android 上应用 recyclerView 适配器

转载 作者:行者123 更新时间:2023-11-30 00:43:56 25 4
gpt4 key购买 nike

此时我已经创建了一个android项目,点击导航菜单中的一项后,应该会打开一个 Activity 。

并且该 Activity 包含一个 recyclerview。但我想做的是我还有2个布局1)introduction_layout.xml(在cardview中包含>>1个textview)2)implementation_layout.xml (contains>> 2 textviews in cardview)

并且,在该 Activity 中,我实现了底部导航 View 作为,

<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)实现

所以我想要的是,当用户点击介绍时, Activity 应该在回收站 View 中加载 introduction_layout.xml当用户单击实现时,应加载 Activity implementation_layout.xml。

在这里,我有一些基本的想法,我必须在回收器适配器中使用 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;
}
}

但是我如何为第二个布局文件创建适配器。以及如何调用该适配器以在回收站 View 上设置?因为,我正在更新菜单项点击的布局意味着点击特定菜单后,所需的布局文件应该打开...

这里有一些关于我的项目的更多信息:1)我的回收站 View 在 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)
{....}

最佳答案

您应该能够使用 View 类型来做到这一点。

RecyclerView.Adapter 支持不同 View 类型的概念,因此列表中的项目可以有不同的 View 。

首先,您需要两个不同的 View 持有者类。我假设介绍文本在两个 View 中是相同的,因此实现 View 持有者可以扩展介绍 View 持有者。如果它们非常不同,它们都可以扩展一个抽象的基本 View 持有者类。

    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。这就是您告诉适配器将哪个 View 支架用于哪个位置的方式。如果您一次更改所有 View ,那么您的适配器可以只有一个当前 View 类型字段:

        public static final int INTRODUCTION_VIEW_TYPE = 0;

public static final int IMPLEMENTATION_VIEW_TYPE = 1;

private int currentViewType;

然后使用它来切换 View 持有者:

        @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;
}
}

关于android - 在多个布局文件-android 上应用 recyclerView 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com