Android ViewPager中包含的片段中的RecyclerView为空
和这件事做斗争太糟糕了 我创建了一个有两个页面的viewpager,一个是工作正常的音频播放器,第二个页面是新闻列表。这是一个片段,小时候有一个回收视图 GradleAndroid 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
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返回的数据是正确的