首页 > 解决方案 > 与 viewPager 一起使用时,recyclerView 不显示数据

问题描述

我试图在 viewPager 中使用 recyclerView。但我无法获得“TAB 1”下的列表。我的 fragment_first.xml 中有一个 TextView 和 Imageview。我试图在我的 recyclerView 上获取 5 个文本和 5 个图像的列表。问题似乎出在testArray、array_image第 94 行,即FirstFragment.java中的return testArray.size()第 75 行,即MainActivity.java中的public int getCount() { return 2;}。我将不胜感激任何帮助。文件如下:

MainActivity.java

package com.example.viewpag;

import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    ViewPager viewPager;
    TabLayout tabLayout;
    FrameLayout frameLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager)findViewById(R.id.view_pager);
        tabLayout = (TabLayout)findViewById(R.id.tabLay);
        setupViewPager(viewPager);
        tabLayout.setupWithViewPager(viewPager);

//        frameLayout=(FrameLayout)findViewById(R.id.frameLayout);
//        FirstFragment fragment = new FirstFragment();
//        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
//        fragmentTransaction.replace(R.id.frameLayout, fragment);
//        fragmentTransaction.commit();
    }

    private void setupViewPager(ViewPager viewPager){
        MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
        myViewPagerAdapter.addFragment(new FirstFragment(), "Tab 1");
        myViewPagerAdapter.addFragment(new SecondFragment(),"Tab 2");

        viewPager.setAdapter(myViewPagerAdapter);
    }


    public class MyViewPagerAdapter extends FragmentPagerAdapter{
        private final List<Fragment> fragmentList = new ArrayList<>();
        private final List<String> fragmentTitleList = new ArrayList<>();


        public MyViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        public void addFragment(Fragment fragment, String title){
            fragmentList.add(fragment);
            fragmentTitleList.add(title);
        }
        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return fragmentTitleList.get(position);
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:tabMode="fixed"
        app:tabGravity="fill"
        android:id="@+id/tabLay"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id ="@+id/frameLayout"/>

</LinearLayout>

FirstFragment.java

package com.example.viewpag;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class FirstFragment extends Fragment{

//    TextView textView;
//    ImageView imageView;
    RecyclerView recyclerView;
    List<String> testArray;
    ArrayList<Integer> array_image;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.fragment_first, container,false);
//        textView = (TextView)view.findViewById(R.id.text_View);
//        imageView = (ImageView)view.findViewById(R.id.image_View);

        recyclerView = (RecyclerView)view.findViewById(R.id.recycler_View);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);

        MyAdapter myAdapter = new MyAdapter();
        recyclerView.setAdapter(myAdapter);

        testArray = new ArrayList<>();
        testArray.add("One");
        testArray.add("Two");
        testArray.add("Three");
        testArray.add("Four");
        testArray.add("Five");

        array_image = new ArrayList<Integer>();
        array_image.add(android.R.drawable.arrow_up_float);
        array_image.add(android.R.drawable.arrow_down_float);
        array_image.add(android.R.drawable.btn_star);
        array_image.add(android.R.drawable.ic_lock_idle_charging);
        array_image.add(android.R.drawable.ic_lock_idle_low_battery);


        return view;
    }

    public class MyAdapter extends RecyclerView.Adapter<MainViewHolder>{

        @Override
        public int getItemViewType(int position) {
            return super.getItemViewType(position);
        }

        @NonNull
        @Override
        public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_first,parent,false);
            return new MainViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
            holder.textView.setText(testArray.get(position));
            holder.imageView.setImageResource(array_image.get(position));
        }

        @Override
        public int getItemCount() {
            return testArray.size();
        }
    }

    public class MainViewHolder extends RecyclerView.ViewHolder{
        TextView textView;
        ImageView imageView;
        public MainViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = (TextView)itemView.findViewById(R.id.text_View);
            imageView = (ImageView)itemView.findViewById(R.id.image_View);

        }
    }
}

fragment_first.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/linearLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">



    <ImageView
        android:id="@+id/image_View"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="abc" />

    <TextView
        android:id="@+id/text_View"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_View"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

另外,SecondFragment.java文件如下:

package com.example.viewpag;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class SecondFragment extends Fragment{

    TextView textView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.fragment_second,container,false);
        textView = (TextView)view.findViewById(R.id.textView2);
        return view;
    }
}

标签: androidandroid-recyclerview

解决方案


首先初始化testArray,

List<String> testArray = new ArrayList<String>();

并更好地将这个 arrayList 作为参数传递给 Adapter 类。

MyAdapter myAdapter = new MyAdapter(testArray);

在您的 MyAdapter 类中,创建一个参数化构造函数

 public class MyAdapter extends RecyclerView.Adapter<MainViewHolder>
 {
    public MyAdapter(List<String> testArray)
    {
        this.testArray = testArray
    }
 }

并通知arrayList的变化

    testArray = new ArrayList<>();
    testArray.add("One");
    testArray.add("Two");
    testArray.add("Three");
    testArray.add("Four");
    testArray.add("Five");

    array_image = new ArrayList<Integer>();
    array_image.add(android.R.drawable.arrow_up_float);
    array_image.add(android.R.drawable.arrow_down_float);
    array_image.add(android.R.drawable.btn_star);
    array_image.add(android.R.drawable.ic_lock_idle_charging);
    array_image.add(android.R.drawable.ic_lock_idle_low_battery);

  myAdapter.notifyDataSetChanged();

你的适配器类应该像

 public class MyAdapter extends RecyclerView.Adapter<MainViewHolder>{

    List<String> testArray1 = new ArrayList<String>(); 
    ArrayList<Integer> array_image1 = new ArrayList<Integer>();

    // parameterized constructor
    public MyAdapter(List<String> testArray, ArrayList<Integer> array_image)
    {
        this.testArray1 = testArray;
        this.array_image1 = array_image;
    }
    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @NonNull
    @Override
    public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_first,parent,false);
        return new MainViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
        holder.textView.setText(testArray1.get(position));
        holder.imageView.setImageResource(array_image1.get(position));
    }

    @Override
    public int getItemCount() {
        return testArray1.size();
    }
}

public class MainViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    ImageView imageView;
    public MainViewHolder(@NonNull View itemView) {
        super(itemView);
        textView = (TextView)itemView.findViewById(R.id.text_View);
        imageView = (ImageView)itemView.findViewById(R.id.image_View);

    }
}

推荐阅读