Android 回收视图不可见
我在MainActivity中有此代码Android 回收视图不可见,android,view,android-recyclerview,Android,View,Android Recyclerview,我在MainActivity中有此代码 public class MainActivity extends AppCompatActivity implements MainViewInterface{ RecyclerView rvMovies; private String TAG = "MainActivity"; MoviesAdapter adapter; MainPresenter mainPresenter; @Override protected void onCreate
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);
}
}
公共类MoviesAdapter扩展了RecyclerView.Adapter{
电影演员名单;
语境;
公共MoviesAdapter(列表movieList,上下文){
this.movieList=movieList;
this.context=上下文;
}
@凌驾
public MoviesHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutFlater.from(上下文)。充气(R.layout.row_movies,parent,false);
电影持有人mh=新电影持有人(v);
返回mh;
}
@凌驾
BindViewHolder上的公共无效(MoviesHolder,内部位置){
holder.tvTitle.setText(movieList.get(position.getTitle());
holder.tvOverview.setText(movieList.get(position.getOverview());
holder.tvleasedate.setText(movieList.get(position.getReleaseDate());
Glide.with(context.load)(“https://image.tmdb.org/t/p/w500/“+movieList.get(position.getPosterPath()).into(holder.ivMovie);
}
@凌驾
public int getItemCount(){
返回movieList.size();
}
公共类MoviesHolder扩展了RecyclerView.ViewHolder{
text查看电视标题、电视概览、电视发布日期;
影像观看;
公共电影持有人(查看项目视图){
超级(项目视图);
tvTitle=(TextView)itemView.findViewById(R.id.tvTitle);
tvOverview=(TextView)itemView.findViewById(R.id.tvOverview);
tvReleaseDate=(TextView)itemView.findViewById(R.id.tvReleaseDate);
ivMovie=(ImageView)itemView.findviewbyd(R.id.ivMovie);
}
}
谢谢,
西奥
已解决
在我的Activity_main.xml中,我的高度和等于0dp!!!我真的不知道如何以及谁将这些值放入!!这就是为什么回收器视图不可见!!!@Override
@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
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupMVP();
rvMovies=(RecyclerView)findviewbyd(R.id.rvMovies);
LinearLayoutManager=新的LinearLayoutManager(此);
manager.setOrientation(LinearLayoutManager.VERTICAL);
rvMovies.setLayoutManager(管理器);
rvMovies.setVisibility(View.VISIBLE);
mainPresenter.getMovies();这两行:
setupMVP();
mainPresenter.getMovies();
必须写在以下内容之后:
rvMovies = (RecyclerView)findViewById(R.id.rvMovies);
设置视图后,需要设置适配器
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();
我认为您应该在创建期间在您的RecyclerView上调用rvMovies.setAdapter(new MoviesAdapter(new ArrayList())
-在RecyclerView上设置一个空的(从项目角度来看)适配器没有什么不好的,它只会显示一个空列表。然后,一旦您准备好了数据(从任何加载源下载/加载)只需调用类似于adapter.setItems(newItemsList)
和adapter.notifyDataSetChanged()
还有一个注意事项:您不应该在类成员字段中存储上下文
,因为可能会发生泄漏(我很确定您的Android Studio也必须以Lint警告检查的形式对此进行投诉)。实际上,您甚至不需要将上下文
实例传递到适配器,因为您只需在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;
}
共享适配器代码日志并验证是否正在调用displayMovies()。如果(movieRespose!=null),则在其中记录另一个also@Nilesh我添加了适配器代码。@Log.d(TAG,String.valueOf(moviesResponse.getResults().size());它返回我20.So displaysMovies()方法正在被调用。请尝试以下操作:创建并初始化getResults()返回的任何对象的数组实例变量…然后在onCreate()中初始化适配器,并将刚刚创建的数组实例变量u传递给它,现在调用数组的instanceVariable=moviesResponse.getResults()…并调用notifyDataSetChanged()在displayMovies()中,你能发布activity_main xmlrvMovies.setVisibility(View.VISIBLE)吗?我很笨。在activity_main.xml中,我的布局高度和布局宽度等于0dp!!!