0

I am creating a social app like TikTok. I am following a tutorial and I ran into a problem. My news feed won't load. I keep getting this error E/RecyclerView: No adapter attached; skipping layout. From what I read on other questions, something is wrong with the adapter.

I don't see any problems it was working fine a while ago. I read the other answers under different questions and still can't find a solution to my problem. Can someone point it out to me please ?

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;
        }
    }
}
terrabytes
  • 11
  • 7
  • 4
    Does this answer your question? [recyclerview No adapter attached; skipping layout](https://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout) – Wini Sep 09 '20 at 05:57

2 Answers2

0

Like the message indicates, your RecyclerView does not have an adapter set. The adapter is only set once the remote call returns, and then only in certain cases. I would create and set the adapter in your init() method and then populate it with values once the call returns.

Markus
  • 66
  • 3
0

You need to move this code from LoadAllPosts() method to init()

VideoPlayerRecyclerAdapter adapter = new VideoPlayerRecyclerAdapter(mediaObjectList, initGlide());
recyclerview.setAdapter(adapter);

Or call:

recyclerview.setMediaObjects(mediaObjectList);

only after calling:

recyclerview.setAdapter(adapter)
null_override
  • 467
  • 3
  • 10
  • 30
  • The first method you recommended didn't work. and I don't really understand what to do in the second part of the answer – terrabytes Sep 09 '20 at 13:20
  • Based on the code you've provided in question I'm suggesting you move two lines of code from LoadAllPosts() method to init(). In the second option I propose to call setAdapter BEFORE submitting any items to the recycler view. – Dmitry Mersiyanov Sep 10 '20 at 09:12