java - 改造 RecyclerView 在选项卡布局中不起作用

标签 java android

我一直在尝试在使用改造库显示已解析数据的 fragment 中实现回收器 View 。每当我运行该项目时,列表都不会显示,并且监视器会显示“E/RecyclerView:未连接适配器;跳过布局”。这是我的代码: 主要 Activity :

package com.example.ahmed.newsapp

import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.design.widget.TabLayout;

public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private  static final int ACTIVITY_NUM = 0;
// TODO - insert your themoviedb.org API KEY here
private final static String API_KEY = "<API KEY CENSORED>";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Find the view pager that will allow the user to swipe between fragments
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

    // Create an adapter that knows which fragment should be shown          

    FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager
    ());
    // Set the adapter onto the view pager
    viewPager.setAdapter(adapter);
    TabLayout ob=(TabLayout) findViewById(R.id.sliding_tabs);
    ob.setupWithViewPager(viewPager);
}
}

fragment 适配器:

package com.example.ahmed.newsapp;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

/**
 * Created by ahmed on 3/22/2017.
 */

public class FragmentAdapter extends FragmentPagerAdapter {
private String tabs[]=new String[]{"Home","Family Members","Colors"};
public FragmentAdapter(FragmentManager fm){
    super(fm);
}

@Override
public Fragment getItem(int position) {
   switch(position){
       case 0:
           return new HomeActivity();
       case 1:
           return new HomeActivity();
      /* case 2:
           return new ColorFragment();*/
   }
    return null;
}
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];


}


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

新闻适配器:

package com.example.ahmed.newsapp;



 /**
    * Created by ahmed on 27-08-17.
    */
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

public class NewsAdapter extends  RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {

private List<News> news;
private int rowLayout;
private Context context;


public static class NewsViewHolder extends RecyclerView.ViewHolder {
    LinearLayout moviesLayout;
    TextView movieTitle;
    TextView data;
    TextView movieDescription;
    TextView rating;


    public NewsViewHolder(View v) {
        super(v);
        moviesLayout = (LinearLayout) v.findViewById(R.id.movies_layout);
        movieTitle = (TextView) v.findViewById(R.id.title);
        data = (TextView) v.findViewById(R.id.subtitle);
        movieDescription = (TextView) v.findViewById(R.id.description);
        rating = (TextView) v.findViewById(R.id.rating);
    }
}

public NewsAdapter(List<News> news, Context context) {
    this.news = news;
   // this.rowLayout = rowLayout;
    this.context = context;
}

@Override
public NewsViewHolder onCreateViewHolder(ViewGroup parent,
                                         int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item_news, parent, false);
    return new NewsViewHolder(view);
}


@Override
public void onBindViewHolder(NewsViewHolder holder, final int position) {
    holder.movieTitle.setText(news.get(position).getTitle());
    holder.data.setText(news.get(position).getReleaseDate());
    holder.movieDescription.setText(news.get(position).getOverview());
    holder.rating.setText(news.get(position).getVoteAverage().toString());
}

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

首页 Activity :

package com.example.ahmed.newsapp;

import android.os.Bundle;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import static android.content.ContentValues.TAG;

public class HomeActivity extends Fragment {

RecyclerView recyclerView;
private final static String API_KEY = "<API KEY CENSORED>";
NewsAdapter adapter;
List<News> news,dummy;
View rootview;
public HomeActivity() {
    // Required empty public constructor
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootview = inflater.inflate(R.layout.activity_home, container, false);

    if (API_KEY.isEmpty()) {
        Toast.makeText(getContext(), "Please obtain your API KEY first from themoviedb.org", Toast.LENGTH_LONG).show();
        return rootview;
    }

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);

    recyclerView = (RecyclerView) rootview.findViewById(R.id.home_page_recycler_view);
    adapter= new NewsAdapter(dummy,getContext());
    Call<NewsResponse> call = apiService.getTopRatedMovies(API_KEY);
    call.enqueue(new Callback<NewsResponse>() {

        @Override
        public void onResponse(Call<NewsResponse> call, Response<NewsResponse> response) {
            news = response.body().getResults();
            adapter.notifyDataSetChanged();
            adapter=new NewsAdapter(news,getContext());

            recyclerView.setAdapter(adapter);
          //  adapter.setData(news);
            Log.d(TAG, "Number of movies received: " + news.size());
        }

        @Override
        public void onFailure(Call<NewsResponse> call, Throwable t) {
            // Log error here since request failed
            Log.e(TAG, t.toString());
        }
    });
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
    return rootview;
}
}

最佳答案

我认为问题出在您的 FragmentAdapter

只需从您的 FragmentAdapter 中删除 return null; 语句,如下面的代码

    @Override
public Fragment getItem(int position) {
     Fragment fragment=null;
   switch(position){
       case 0:
            fragment= new HomeActivity();
       case 1:
           fragment= new HomeActivity();
      /* case 2:
           return new ColorFragment();*/
   }
    return fragment;
}

改变这个

 recyclerView.setHasFixedSize(true);
 recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
recyclerView = (RecyclerView) rootview.findViewById(R.id.home_page_recycler_view);
adapter= new NewsAdapter(dummy,getContext());

关于java - 改造 RecyclerView 在选项卡布局中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45957720/

相关文章:

java - 当 list 文件不包含 jar 版本时获取 jar 版本

java - 公共(public)函数不返回值

android - 应用程序截图在上传到 Google Play 商店后变得模糊

android - GPS OnPause 代码不会关闭 GPS

android - 默认情况下,Android 手机上的 Firebase FCM token 存储在哪里

java - 在输出之前打印一个新行?

java - 高效 Kademlia 桶

java - removeEldestEntry 覆盖

android - 具有位置的 Google Maps 7.0.0 的 Intent

Android:ViewBinding 的 ScrollView 内没有可用的 View ID。如何访问?