使用了Banner2:https://github.com/youth5201314/banner
在Fragment中使用Banner2,报错:RecyclerView: No adapter attached; skipping layout。
请求数据部分

显示部分

结果与日志

奇怪的是在activity里也使用了类似的代码,却可以显示


============补充============
代码结构是学习领券联盟的
HomePresenterImpl:
package com.example.smart_1.presenter.impl;
import com.example.smart_1.model.Api;
import com.example.smart_1.model.domain.LooperBean;
import com.example.smart_1.presenter.IHomePresenter;
import com.example.smart_1.ui.IHomeCallback;
import com.example.smart_1.utils.LogUtil;
import com.example.smart_1.utils.RetrofitManager;
import java.net.HttpURLConnection;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomePresenterImpl implements IHomePresenter {
@Override
public void getLooperContent() {
if (mCallback == null) {
return;
}
mCallback.onLoading();
Api api = RetrofitManager.getRetrofit().create(Api.class);
api.getLooperBean().enqueue(new Callback<LooperBean>() {
@Override
public void onResponse(Call<LooperBean> call, Response<LooperBean> response) {
LooperBean body = response.body();
int code = body.getCode();
LogUtil.d(HomePresenterImpl.this, "code is ==> " + code);
if (code == HttpURLConnection.HTTP_OK) {
mCallback.onLooperContentLoaded(body);
} else {
LogUtil.d(HomePresenterImpl.this, "请求失败," + body.getMsg());
mCallback.onError();
}
}
@Override
public void onFailure(Call<LooperBean> call, Throwable throwable) {
LogUtil.e(HomePresenterImpl.this, "网络错误。。");
mCallback.onError();
}
});
}
IHomeCallback mCallback = null;
@Override
public void registerViewCallback(IHomeCallback callback) {
mCallback = callback;
}
@Override
public void unregisterViewCallback(IHomeCallback callback) {
mCallback = null;
}
}
HomeFragment:
package com.example.smart_1.ui.fragment;
import android.content.Context;
import android.view.View;
import com.bumptech.glide.Glide;
import com.example.smart_1.R;
import com.example.smart_1.base.BaseFragment;
import com.example.smart_1.model.domain.LooperBean;
import com.example.smart_1.presenter.impl.HomePresenterImpl;
import com.example.smart_1.ui.IHomeCallback;
import com.example.smart_1.utils.Constants;
import com.example.smart_1.utils.LogUtil;
import com.youth.banner.Banner;
import com.youth.banner.adapter.BannerImageAdapter;
import com.youth.banner.holder.BannerImageHolder;
import com.youth.banner.indicator.CircleIndicator;
import java.util.ArrayList;
import java.util.List;
public class HomeFragment extends BaseFragment implements IHomeCallback {
private HomePresenterImpl mHomePresenterImpl;
private Banner mBanner;
private Context mContext;
@Override
protected void initPresenter() {
mHomePresenterImpl = new HomePresenterImpl();
mHomePresenterImpl.registerViewCallback(this);
}
@Override
protected void release() {
if (mHomePresenterImpl != null) {
mHomePresenterImpl.unregisterViewCallback(this);
}
}
@Override
protected void loadData() {
mHomePresenterImpl.getLooperContent();
}
@Override
protected void initEven() {
}
@Override
protected void initView(View rootView, View currentView) {
mContext = currentView.getContext();
mBanner = currentView.findViewById(R.id.home_banner);
}
@Override
protected int getLayoutId() {
return R.layout.fragment_home;
}
private List<LooperBean.RowsBean> mRowsBeans = new ArrayList<>();
@Override
public void onLooperContentLoaded(LooperBean body) {
List<LooperBean.RowsBean> rows = body.getRows();
mRowsBeans.clear();
mRowsBeans.addAll(rows);
LogUtil.d(HomeFragment.this, "rows is ==> " + rows.toString());
BannerImageAdapter<LooperBean.RowsBean> adapter = new BannerImageAdapter<LooperBean.RowsBean>(mRowsBeans) {
@Override
public void onBindView(BannerImageHolder bannerImageHolder, LooperBean.RowsBean rowsBean, int i, int i1) {
Glide.with(bannerImageHolder.itemView)
.load(Constants.BASE_URL + rowsBean.getAdvImg())
.into(bannerImageHolder.imageView);
}
};
mBanner.addBannerLifecycleObserver(this)
.setAdapter(adapter)
.setIndicator(new CircleIndicator(getActivity()));
setUpState(State.SUCCESS);
}
@Override
public void onLoading() {
setUpState(State.LOADING);
}
@Override
public void onError() {
setUpState(State.ERROR);
}
@Override
public void onEmpty() {
setUpState(State.EMPTY);
}
}
BaseFragment:
package com.example.smart_1.base;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.example.smart_1.R;
public abstract class BaseFragment extends Fragment {
private FrameLayout mBaseContainer;
private View mSuccessView;
private View mLoadingView;
private View mErrorView;
private View mEmptyView;
public enum State {
NONE, LOADING, SUCCESS, ERROR, EMPTY
}
private State currentState;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = getRootView(inflater, container);
mBaseContainer = rootView.findViewById(R.id.base_container);
loadStatesView(inflater, container);
View targetView = loadTargetView(inflater, container);
initPresenter();
initView(rootView, targetView);
initEven();
loadData();
return rootView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
release();
}
protected abstract void initPresenter();
protected abstract void release();
protected abstract void loadData();
protected abstract void initEven();
protected abstract void initView(View rootView, View currentView);
private void loadStatesView(LayoutInflater inflater, ViewGroup container) {
mSuccessView = loadTargetView(inflater, container);
mLoadingView = loadLoadingView(inflater, container);
mErrorView = loadErrorView(inflater, container);
mEmptyView = loadEmptyView(inflater, container);
mBaseContainer.addView(mSuccessView);
mBaseContainer.addView(mLoadingView);
mBaseContainer.addView(mErrorView);
mBaseContainer.addView(mEmptyView);
setUpState(State.NONE);
}
protected void setUpState(State state) {
this.currentState = state;
//判断各View的可见性
mSuccessView.setVisibility(currentState == State.SUCCESS ? View.VISIBLE : View.GONE);
mLoadingView.setVisibility(currentState == State.LOADING ? View.VISIBLE : View.GONE);
mErrorView.setVisibility(currentState == State.ERROR ? View.VISIBLE : View.GONE);
mEmptyView.setVisibility(currentState == State.EMPTY ? View.VISIBLE : View.GONE);
}
private View loadEmptyView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.fragment_empty, container, false);
}
private View loadErrorView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.fragment_error, container, false);
}
private View loadLoadingView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.fragment_loading, container, false);
}
private View loadTargetView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(getLayoutId(), container, false);
}
protected abstract int getLayoutId();
private View getRootView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.base_fragment_layout, container, false);
}
}
在你的BaseFragment里
这个是加载rootView的吧。
也就是调用这个
加载你的targetView的是这个
也就是调用了这个
接着你调用
你的targetView有添加到rootView里吗?
Fragment的代码呢?