Android ViewPager中包含的片段中的RecyclerView为空

Android ViewPager中包含的片段中的RecyclerView为空,android,android-fragments,android-recyclerview,android-viewpager,Android,Android Fragments,Android Recyclerview,Android Viewpager,和这件事做斗争太糟糕了 我创建了一个有两个页面的viewpager,一个是工作正常的音频播放器,第二个页面是新闻列表。这是一个片段,小时候有一个回收视图 Gradle dependencies { implementation 'com.android.support.constraint:constraint-layout:1.1.1' implementation fileTree(include: ['*.jar'], dir: 'libs') implementa

和这件事做斗争太糟糕了

我创建了一个有两个页面的viewpager,一个是工作正常的音频播放器,第二个页面是新闻列表。这是一个片段,小时候有一个回收视图

Gradle

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:1.1.1'
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':library')
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.squareup.picasso:picasso:2.71828'
    implementation 'com.android.volley:volley:1.1.0'
}
可视寻呼机适配器

private class mPagerAdapter extends FragmentStatePagerAdapter {

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

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

                case 0: return PlayerPage.newInstance();
                case 1: return News.newInstance();
                default: return PlayerPage.newInstance();
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.MyViewHolder>{

    private List<NewsBlueprint> news;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title;
        public ImageView thumbnail;

        public MyViewHolder(View view) {
            super(view);

            title = view.findViewById(R.id.title);
            thumbnail = view.findViewById(R.id.thumbnail);
        }
    }

    public NewsAdapter(List<NewsBlueprint> newsList) {
        this.news = newsList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.news_row, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        NewsBlueprint newsBlueprint = news.get(position);
        holder.title.setText(newsBlueprint.getTitle());
        // Set thumbnail
        //Picasso.get().load(newsBlueprint.getImageURL()).into(holder.thumbnail);
    }

    public int getItemCount() {
        return news.size();
    }

    }
新闻片段

public class News extends Fragment {
    private List<NewsBlueprint> newsList = new ArrayList<>();
    private RecyclerView recyclerView;
    private NewsAdapter newsAdapter;
    private ProgressBar progressBar;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_news, container, false);

        progressBar = (ProgressBar) v.findViewById(R.id.progress_bar);

        recyclerView = (RecyclerView) v.findViewById(R.id.news_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getBaseContext()));
        recyclerView.setHasFixedSize(true);
        recyclerView.setItemViewCacheSize(View.DRAWING_CACHE_QUALITY_HIGH);

        // Fill with test
        newsList.add(new NewsBlueprint("hi", "hi", "hi", "hi"));

        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    newsAdapter = new NewsAdapter(newsList);
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            recyclerView.setAdapter(newsAdapter);
                        }
                    });
                }
            }).start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        getNews();

        return v;
    }

    public static News newInstance() {
        return new News();
    }

    public void getNews() {
        newsList.clear();
        progressBar.setVisibility(View.VISIBLE);
        String url = "I removed link for privacy on StackOverflow";

        RequestQueue mRequestQueue;
        Cache cache = new DiskBasedCache(getActivity().getCacheDir(), 1024 * 1024); // 1MB cap
        Network network = new BasicNetwork(new HurlStack());
        mRequestQueue = new RequestQueue(cache, network);
        mRequestQueue.start();

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                try {

                    JSONObject current = null;

                    for (int i = 0; i < response.length(); i++) {

                        current = response.getJSONObject(i);

                        // Get the topStory's title from the volume information
                        String topStoryTitle =  current.getJSONObject("title").getString("rendered");
                        // Get the current topStory's section information
                        // The appropriate section that the story belongs to is contained in the subsection
                        String topStorySection = current.getJSONObject("content").getString("rendered");

                        // Get the date on which the news was published
                        // Extract date information from the JSON response
                        String topStoryDateTime = current.getString("date");

                        // Get the story url
                        String storyUrl = current.getString("link");

                        JSONObject res = current.getJSONObject("_links");
                        JSONArray multimedia = res.getJSONArray("wp:featuredmedia");
                        String href = multimedia.getJSONObject(0).getString("href");

                        newsList.add(new NewsBlueprint(topStoryTitle, topStorySection, topStoryDateTime, href));


                        Toast.makeText(getContext(), "Looping " + topStoryTitle, Toast.LENGTH_SHORT).show();

                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getContext(), "Make sure you are connected to the internet", Toast.LENGTH_SHORT).show();
            }
        });

        mRequestQueue.add(jsonArrayRequest);
        newsAdapter.notifyDataSetChanged();


        progressBar.setVisibility(View.INVISIBLE);
    }
}
公共类新闻扩展片段{
private List newsList=new ArrayList();
私人回收站;
私有新闻适配器;
私人ProgressBar ProgressBar;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图v=充气机。充气(R.layout.fragment\u新闻,容器,假);
progressBar=(progressBar)v.findViewById(R.id.progress\u bar);
recyclerView=(recyclerView)v.findViewById(R.id.news\u recyclerView);
setLayoutManager(新的LinearLayoutManager(getActivity().getBaseContext());
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(视图、图形、缓存、质量、高);
//充满测试
添加(新的新闻蓝图(“嗨”、“嗨”、“嗨”、“嗨”));
试一试{
新线程(newrunnable()){
@凌驾
公开募捐{
newsAdapter=新的newsAdapter(新闻列表);
getActivity().runOnUiThread(新的Runnable()){
@凌驾
公开募捐{
recyclerView.setAdapter(新闻适配器);
}
});
}
}).start();
}捕获(例外情况除外){
例如printStackTrace();
}
获取新闻();
返回v;
}
公共静态新闻newInstance(){
返回新消息();
}
公共新闻{
newsList.clear();
progressBar.setVisibility(View.VISIBLE);
String url=“我删除了StackOverflow上的隐私链接”;
请求队列mRequestQueue;
缓存缓存=新的DiskBasedCache(getActivity().getCacheDir(),1024*1024);//1MB上限
网络=新的基本网络(new HurlStack());
mRequestQueue=新请求队列(缓存、网络);
mRequestQueue.start();
JsonArrayRequest JsonArrayRequest=新的JsonArrayRequest(Request.Method.GET,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONArray响应){
试一试{
JSONObject当前=空;
对于(int i=0;i
新闻适配器

private class mPagerAdapter extends FragmentStatePagerAdapter {

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

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

                case 0: return PlayerPage.newInstance();
                case 1: return News.newInstance();
                default: return PlayerPage.newInstance();
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.MyViewHolder>{

    private List<NewsBlueprint> news;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title;
        public ImageView thumbnail;

        public MyViewHolder(View view) {
            super(view);

            title = view.findViewById(R.id.title);
            thumbnail = view.findViewById(R.id.thumbnail);
        }
    }

    public NewsAdapter(List<NewsBlueprint> newsList) {
        this.news = newsList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.news_row, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        NewsBlueprint newsBlueprint = news.get(position);
        holder.title.setText(newsBlueprint.getTitle());
        // Set thumbnail
        //Picasso.get().load(newsBlueprint.getImageURL()).into(holder.thumbnail);
    }

    public int getItemCount() {
        return news.size();
    }

    }
公共类NewsAdapter扩展了RecyclerView.Adapter{ 私人列表新闻; 公共类MyViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图标题; 公共图像视图缩略图; 公共MyViewHolder(视图){ 超级(视图); title=view.findViewById(R.id.title); 缩略图=view.findViewById(R.id.缩略图); } } 公共新闻适配器(列表新闻列表){ this.news=新闻列表; } @非空 @凌驾 public MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ View itemView=LayoutInflater.from(parent.getContext()) .充气(R.layout.news_行,父级,假); 返回新的MyViewHolder(itemView); } @凌驾 public void onBindViewHolder(@NonNull MyViewHolder,int位置){ NewsBlueprint NewsBlueprint=news.get(位置); holder.title.setText(newsBlueprint.getTitle()); //设置缩略图 //Picasso.get().load(newsBlueprint.getImageURL()).into(holder.thumbnail); } public int getItemCount(){ returnnews.size(); } }
新闻蓝图

public class News extends Fragment {
    private List<NewsBlueprint> newsList = new ArrayList<>();
    private RecyclerView recyclerView;
    private NewsAdapter newsAdapter;
    private ProgressBar progressBar;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_news, container, false);

        progressBar = (ProgressBar) v.findViewById(R.id.progress_bar);

        recyclerView = (RecyclerView) v.findViewById(R.id.news_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getBaseContext()));
        recyclerView.setHasFixedSize(true);
        recyclerView.setItemViewCacheSize(View.DRAWING_CACHE_QUALITY_HIGH);

        // Fill with test
        newsList.add(new NewsBlueprint("hi", "hi", "hi", "hi"));

        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    newsAdapter = new NewsAdapter(newsList);
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            recyclerView.setAdapter(newsAdapter);
                        }
                    });
                }
            }).start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        getNews();

        return v;
    }

    public static News newInstance() {
        return new News();
    }

    public void getNews() {
        newsList.clear();
        progressBar.setVisibility(View.VISIBLE);
        String url = "I removed link for privacy on StackOverflow";

        RequestQueue mRequestQueue;
        Cache cache = new DiskBasedCache(getActivity().getCacheDir(), 1024 * 1024); // 1MB cap
        Network network = new BasicNetwork(new HurlStack());
        mRequestQueue = new RequestQueue(cache, network);
        mRequestQueue.start();

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                try {

                    JSONObject current = null;

                    for (int i = 0; i < response.length(); i++) {

                        current = response.getJSONObject(i);

                        // Get the topStory's title from the volume information
                        String topStoryTitle =  current.getJSONObject("title").getString("rendered");
                        // Get the current topStory's section information
                        // The appropriate section that the story belongs to is contained in the subsection
                        String topStorySection = current.getJSONObject("content").getString("rendered");

                        // Get the date on which the news was published
                        // Extract date information from the JSON response
                        String topStoryDateTime = current.getString("date");

                        // Get the story url
                        String storyUrl = current.getString("link");

                        JSONObject res = current.getJSONObject("_links");
                        JSONArray multimedia = res.getJSONArray("wp:featuredmedia");
                        String href = multimedia.getJSONObject(0).getString("href");

                        newsList.add(new NewsBlueprint(topStoryTitle, topStorySection, topStoryDateTime, href));


                        Toast.makeText(getContext(), "Looping " + topStoryTitle, Toast.LENGTH_SHORT).show();

                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getContext(), "Make sure you are connected to the internet", Toast.LENGTH_SHORT).show();
            }
        });

        mRequestQueue.add(jsonArrayRequest);
        newsAdapter.notifyDataSetChanged();


        progressBar.setVisibility(View.INVISIBLE);
    }
}
只是一个表示新闻项的类

结果是一个空的RecyclerView

我确保从JSON返回的数据是正确的