我正在创建一个类似TikTok的社交应用。我正在学习教程,但遇到了问题。我的新闻提要无法加载。我不断收到此错误E/RecyclerView: No adapter attached; skipping layout
。根据我在其他问题上看到的内容,适配器有问题。
我没看到任何问题,它前段时间运行良好。我阅读了不同问题下的其他答案,但仍然找不到解决我问题的方法。有人可以向我指出吗?
public class HomeActivity extends AppCompatActivity {
private ArrayList<MediaObject> mediaObjectList = new ArrayList<>();
private VideoPlayerRecyclerView recyclerview;
public static ApiInterface apiInterface;
private static final int CAMERA_PERMISSION_REQUEST_CODE = 88888;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
init();
}
private void init() {
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
setWindowFlag(this, WindowManager.LayoutParams. FLAG_TRANSLUCENT_STATUS, true);
}
if (Build.VERSION.SDK_INT >= 19){
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
// Make fully Android Transparent Status Bar
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams. FLAG_TRANSLUCENT_STATUS, false);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
//////////////////////////// recycler view//////////////////////////////
recyclerview = (VideoPlayerRecyclerView) findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.VERTICAL);
recyclerview.setLayoutManager(layoutManager);
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
VerticalSpacingItemDecorator itemDecorator = new VerticalSpacingItemDecorator(0);
recyclerview.addItemDecoration(itemDecorator);
///////////////////////////////////////////////
SnapHelper mSnapHelper = new PagerSnapHelper();
mSnapHelper.attachToRecyclerView(recyclerview);
//////////////////////////////////////////////
LoadAllPosts();
}
private void LoadAllPosts() {
Call<Users> call = apiInterface.performAllPosts();
call.enqueue(new Callback<Users>() {
@Override
public void onResponse(Call<Users> call, Response<Users> response) {
if (response.isSuccessful()) {
mediaObjectList = response.body().getAllPosts();
if (mediaObjectList != null) {
recyclerview.setMediaObjects(mediaObjectList);
VideoPlayerRecyclerAdapter adapter = new VideoPlayerRecyclerAdapter(mediaObjectList, initGlide());
recyclerview.setAdapter(adapter);
adapter.notifyDataSetChanged();
recyclerview.setKeepScreenOn(true);
recyclerview.smoothScrollToPosition(mediaObjectList.size() + 1);
} else {
Toast.makeText(HomeActivity.this, "No Posts to show you.", Toast.LENGTH_SHORT).show();
}
}
else {
Toast.makeText(HomeActivity.this, "Network Error 1.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Users> call, Throwable t) {
Toast.makeText(HomeActivity.this, "Network Error 2.", Toast.LENGTH_SHORT).show();
}
});
}
public static void setWindowFlag(@NonNull Activity activity, final int bits, boolean on) {
Window win = activity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
if(on){
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
private RequestManager initGlide(){
RequestOptions options = new RequestOptions()
.placeholder(R.color.colorPrimaryDark)
.error(R.color.colorPrimaryDark);
return Glide.with(this)
.setDefaultRequestOptions(options);
}
@Override
protected void onDestroy() {
if(recyclerview !=null)
recyclerview.releasePlayer();
super.onDestroy();
}
@Override
protected void onStop() {
super.onStop();
if(recyclerview !=null)
recyclerview.releasePlayer();
finish();
}
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
public void followingBtn(View view) {
Intent intent = new Intent(HomeActivity.this, FollowingActivity.class);
startActivity(intent);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Animatoo.animateSwipeLeft(this);
finish();
}
public void addBtn(View view) {
checkPermission();
Intent intent = new Intent(HomeActivity.this, PortraitCameraActivity.class);
startActivity(intent);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Animatoo.animateSlideUp(this);
finish();
}
@Override
protected void onResume() {
super.onResume();
checkPermission();
}
private void checkPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
// request camera permission if it has not been grunted.
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||
checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED ||
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
) {
requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case CAMERA_PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(HomeActivity.this, "permission has been granted.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(HomeActivity.this, "[WARN] permission is not granted.", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
答案 0 :(得分:0)
就像该消息指示的那样,您的RecyclerView没有设置适配器。仅在远程调用返回后才设置适配器,然后仅在某些情况下才设置。我会在您的init()方法中创建并设置适配器,然后在调用返回后用值填充适配器。
答案 1 :(得分:0)
您需要将此代码从LoadAllPosts()
方法移至init()
VideoPlayerRecyclerAdapter adapter = new VideoPlayerRecyclerAdapter(mediaObjectList, initGlide());
recyclerview.setAdapter(adapter);
或致电:
recyclerview.setMediaObjects(mediaObjectList);
仅在致电后
:recyclerview.setAdapter(adapter)