代码之家  ›  专栏  ›  技术社区  ›  Theo

RecyclerView不可见

  •  0
  • Theo  · 技术社区  · 6 年前

    我的主活动中有这个代码

    public class MainActivity extends AppCompatActivity implements MainViewInterface{
    
    RecyclerView rvMovies;
    
    private String TAG = "MainActivity";
    MoviesAdapter adapter;
    MainPresenter mainPresenter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        setupMVP();
        mainPresenter.getMovies();
    
        rvMovies = (RecyclerView)findViewById(R.id.rvMovies);
    
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        rvMovies.setLayoutManager(manager);
        //rvMovies.setHasFixedSize(true);
    }
    
    private void setupMVP() {
    
        mainPresenter = new MainPresenter(this);
    
    }
    
    
    
    @Override
    public void showToast(String s) {
        Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
    }
    
    @Override
    public void displayMovies(MovieResponse moviesResponse) {
    
        if(moviesResponse!=null) {
            Log.d(TAG,moviesResponse.getResults().get(1).getTitle());
            adapter = new MoviesAdapter(moviesResponse.getResults(), MainActivity.this);
            rvMovies.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }else{
            Log.d(TAG,"Movies response null");
        }
    
    }
    
    @Override
    public void displayError(String s) {
        showToast(s);
      }
    }
    

    但我明白了

    E/RecyclerView: No adapter attached; skipping layout
    

    我知道其他人也会问同样的问题。我试过他们的解决办法,但没有成功。我错过了什么?

    这是我的适配器代码。

    public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MoviesHolder> {
    List<Result> movieList;
    Context context;
    
    public MoviesAdapter(List<Result> movieList, Context context){
        this.movieList = movieList;
        this.context = context;
    }
    
    @Override
    public MoviesHolder onCreateViewHolder( ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.row_movies,parent,false);
        MoviesHolder mh = new MoviesHolder(v);
        return mh;
    }
    
    @Override
    public void onBindViewHolder( MoviesHolder holder, int position) {
    
        holder.tvTitle.setText(movieList.get(position).getTitle());
        holder.tvOverview.setText(movieList.get(position).getOverview());
        holder.tvReleaseDate.setText(movieList.get(position).getReleaseDate());
        Glide.with(context).load("https://image.tmdb.org/t/p/w500/"+movieList.get(position).getPosterPath()).into(holder.ivMovie);
    
    }
    
    @Override
    public int getItemCount() {
        return movieList.size();
    }
    
    public class MoviesHolder extends RecyclerView.ViewHolder {
    
        TextView tvTitle,tvOverview,tvReleaseDate;
        ImageView ivMovie;
    
        public MoviesHolder(View itemView) {
            super(itemView);
            tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
            tvOverview = (TextView) itemView.findViewById(R.id.tvOverView);
            tvReleaseDate = (TextView) itemView.findViewById(R.id.tvReleaseDate);
            ivMovie = (ImageView) itemView.findViewById(R.id.ivMovie);
        }
      }
    

    谢谢, 西奥。

    解决了的

    在我的activity_main.xml中,我的身高与0dp相等!!! 我真的不知道这些价值观是怎么体现出来的,是谁体现出来的!!这就是为什么回收站视图不可见的原因!!!

    4 回复  |  直到 6 年前
        1
  •  2
  •   Urvish rana    6 年前

    在设置视图之后,需要设置适配器。

    rvMovies = (RecyclerView)findViewById(R.id.rvMovies);
    LinearLayoutManager manager = new LinearLayoutManager(this);
    manager.setOrientation(LinearLayoutManager.VERTICAL);
    rvMovies.setLayoutManager(manager);
    //rvMovies.setHasFixedSize(true);
    //call after setting the view
    mainPresenter.getMovies(); 
    
        2
  •  1
  •   Miroslav Javorský steven    6 年前

    我觉得你应该打电话 rvMovies.setAdapter(new MoviesAdapter(new ArrayList<>())) 在您的回收服务期间 onCreate -在RecyclerView上设置一个空(从items透视图)适配器没有什么不好的,它只会显示一个空列表。一旦你准备好了数据(从你正在加载的任何源下载/加载),你只需要调用 adapter.setItems(newItemsList) adapter.notifyDataSetChanged() .

    还有一个注意事项:您不应该存储 Context 在类成员字段中,可能会发生泄漏(我确信你的Android工作室必须以Lint警告检查的形式对此进行投诉)。你其实根本不需要 上下文 实例传递到适配器,因为您可以简单地检索 上下文 实例来自 parent 查看 onCreateViewHolder -重写如下:

    @Override
    public MoviesHolder onCreateViewHolder( ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_movies,parent,false);
        MoviesHolder mh = new MoviesHolder(v);
        return mh;
    }
    
        3
  •  0
  •   user8959091user8959091    6 年前

    这两行:

    setupMVP();
    mainPresenter.getMovies();
    

    必须在以下日期后书写:

    rvMovies = (RecyclerView)findViewById(R.id.rvMovies);
    
        4
  •  0
  •   Vinay Rathod    6 年前
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        setupMVP();
    
        rvMovies = (RecyclerView)findViewById(R.id.rvMovies);
    
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        rvMovies.setLayoutManager(manager);
        rvMovies.setVisibility(View.VISIBLE);
        mainPresenter.getMovies();  <== put this line in last
    }