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

时间:2017-02-08 09:39:24

标签: android android-recyclerview

此时我创建了一个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)
{....}

1 个答案:

答案 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;
            }
        }