Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 回收视图不可见_Android_View_Android Recyclerview - Fatal编程技术网

Android 回收视图不可见

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

我在MainActivity中有此代码

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!!!