Exo Player 2 implementation on a listview

0

I'm trying to create a newsfeed, something similar to Facebook/Instagram where there are text only posts, Image posts and also Video posts. Image and text posts load fine, the problem I am facing at the moment is on the Video part.

If the post is a video I am able to show the ExoVideoview with the video loaded in it works well for the first time I populate the listview. The issue is that,

  1. When I scroll down one or two positions down and come back to the top the video is unplayable. But if scroll down atleast 10 positions and come back it starts to play.

  2. When I move out to the second position the top video keeps playing and at certain times only the audio is playing. I understand this might be cause the player isn't released properly which I would like to know what the best way is to release it.

Any help would be really appreciated as I could't find any proper solution on the internet for this for the past few days. Attached the code for the Adapter below.

public mlibraryAdapter(Context mContext, List<newsfeedSetter> list, ArrayList<String> userids, ArrayList<String> postids, ArrayList<String> b_ids, ArrayList<String> o_spid)
    {
        this.mContext = mContext;
        this.feedlist = list;
        this.user_id = userids;
        this.post_id = postids;
        this.bids = b_ids;
        this.o_s_pid = o_spid;

        fillfeed();
    }

    @Override
    public int getCount()
    {
        return feedlist.size();
    }

    @Override
    public Object getItem(int position)
    {
        return null;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        final newsfeedSetter ns = feedlist.get(position);
        ImageLoader imageLoader = ImageLoader.getInstance();

    if (position < postsl.size())
    {
        if (postsl.get(position) != null)
        {
            convertView = postsl.get(position);
            return convertView;
        }
        else
        {
            LayoutInflater lInflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = lInflater.inflate(R.layout.newsfeed_cell, null);
        }
    }
    else
    //if (convertView == null)
    {
        LayoutInflater lInflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = lInflater.inflate(R.layout.newsfeed_cell, null);
    }

        //LayoutInflater lInflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        //convertView = lInflater.inflate(R.layout.newsfeed_cell, null);

        //final RelativeLayout mainLayout = convertView.findViewById(R.id.mainLayout);
        final LinearLayout content = convertView.findViewById(R.id.ml_content);
        CircleImageView profImg = convertView.findViewById(R.id.profile_image);
        SimpleExoPlayerView postVid = convertView.findViewById(R.id.vid_postVid);
        TextView userName = convertView.findViewById(R.id.lbl_name);
        TextView postText = convertView.findViewById(R.id.lbl_postText);
        final ImageView postImg = convertView.findViewById(R.id.img_postImg);

        final TextView inspiredCount = convertView.findViewById(R.id.lbl_inspiredCount);
        final TextView commentsCount = convertView.findViewById(R.id.lbl_commentsCount);
        final TextView sharesCount = convertView.findViewById(R.id.lbl_sharesCount);
        final TextView sharesText = convertView.findViewById(R.id.lbl_shareText);
        //final TextView viewsCount = convertView.findViewById(R.id.lbl_viewCount);
        final TextView staticShareText = convertView.findViewById(R.id.shareStaticText);
        final TextView inspireText = convertView.findViewById(R.id.nf_inspireText);
        final TextView viewsCount = convertView.findViewById(R.id.lbl_viewsCount);
        TextView viewsCountText = convertView.findViewById(R.id.nf_viewsText);

        final UniversalMediaController mMediaController = (UniversalMediaController) convertView.findViewById(R.id.media_controller);
        final Spinner manage = convertView.findViewById(R.id.post_manage);

        final SparkButton btninspire = convertView.findViewById(R.id.btn_inspire);
        ImageButton btncomment = convertView.findViewById(R.id.btn_comment);
        ImageButton btnshare = convertView.findViewById(R.id.btn_share);
        final SparkButton btnsave = convertView.findViewById(R.id.btn_savePost);

        LinearLayout sLayout = convertView.findViewById(R.id.shareLayout);
        CircleImageView sUserImg = convertView.findViewById(R.id.shareuser_img);
        TextView sUserName = convertView.findViewById(R.id.shareuser_name);
        TextView sUserText = convertView.findViewById(R.id.shareUser_Text);
        final ProgressBar progressBar = convertView.findViewById(R.id.nf_progressBar);
        final ImageView verfiedIcon = convertView.findViewById(R.id.mlib_verified);

        // Write a message to the database
        database = FirebaseDatabase.getInstance();

        final AppCompatActivity activity = (AppCompatActivity) mContext;
        final Initializer initializer = (Initializer) activity.getApplication();

        if (ns.getId().equals(initializer.getuserid()) || ns.getSharedId().equals(initializer.getuserid())) {
            manage.setVisibility(View.VISIBLE);
            ArrayAdapter<String> fontAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1, managePostuser);
            fontAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            manage.setAdapter(fontAdapter);

            manage.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int sposition, long id) {
                    ((TextView) parent.getChildAt(0)).setTextColor(0x00000000);

                    if (sposition == 1) {
                        if (ns.getSharedId().equals("")) {
                            AppCompatActivity activity = (AppCompatActivity) mContext;
                            Intent intent = new Intent(mContext, editPost.class);
                            intent.putExtra("pid", post_id.get(position));
                            intent.putExtra("ptext", ns.getPostText());
                            intent.putExtra("pimg", ns.getPostImg());
                            intent.putExtra("pvid", ns.getPostVid());
                            activity.startActivity(intent);
                        } else {
                            AppCompatActivity activity = (AppCompatActivity) mContext;
                            Intent intent = new Intent(mContext, editPost.class);
                            intent.putExtra("pid", post_id.get(position));
                            intent.putExtra("ptext", ns.getSharedText());
                            intent.putExtra("pimg", ns.getPostImg());
                            intent.putExtra("pvid", ns.getPostVid());
                            activity.startActivity(intent);
                        }
                    } else if (sposition == 2) {
                        android.support.v7.app.AlertDialog.Builder alertDialogBuilder = new android.support.v7.app.AlertDialog.Builder(mContext);

                        alertDialogBuilder.setTitle("Delete Post");
                        alertDialogBuilder.setMessage("Are you sure you want to delete this post?");
                        // set the uploadform.xml to alertdialog builder

                        alertDialogBuilder.setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                deletePost(post_id.get(position));
                                feedlist.remove(position);
                            }
                        }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });

                        // create alert dialog
                        android.support.v7.app.AlertDialog alertDialog = alertDialogBuilder.create();

                        // show it
                        alertDialog.show();
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        } else {
            manage.setVisibility(View.VISIBLE);
            ArrayAdapter<String> fontAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1, managePostother);
            fontAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            manage.setAdapter(fontAdapter);

            manage.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int sposition, long id) {
                    ((TextView) parent.getChildAt(0)).setTextColor(0x00000000);

                    if (sposition == 1) {
                        android.support.v7.app.AlertDialog.Builder alertDialogBuilder = new android.support.v7.app.AlertDialog.Builder(mContext);

                        alertDialogBuilder.setTitle("Report Post");
                        alertDialogBuilder.setMessage("You can report yet");
                        // set the uploadform.xml to alertdialog builder

                        alertDialogBuilder.setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                deletePost(post_id.get(position));
                                feedlist.remove(position);
                            }
                        }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });

                        // create alert dialog
                        android.support.v7.app.AlertDialog alertDialog = alertDialogBuilder.create();

                        // show it
                        alertDialog.show();
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        }


        if (!ns.getSharedId().equals("")) {
            sUserImg.setVisibility(View.VISIBLE);
            sUserName.setVisibility(View.VISIBLE);
            staticShareText.setVisibility(View.VISIBLE);
            sUserText.setVisibility(View.VISIBLE);


            //sLayout.setVisibility(View.VISIBLE);
            if (!ns.getSharedPic().equals("")) {
                getImageFromUrl(ns.getSharedPic(), sUserImg);
            }
            sUserName.setText(ns.getSharedName().trim());
            sUserText.setText(ns.getSharedText().trim());
        } else {
            sUserImg.setVisibility(View.GONE);
            sUserName.setVisibility(View.GONE);
            staticShareText.setVisibility(View.GONE);
            sUserText.setVisibility(View.GONE);

            //sLayout.setVisibility(View.GONE);
        }


        sharesCount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, inspired.class);
                intent.putExtra("pid", post_id.get(position));
                intent.putExtra("type", "Shares");
                activity.startActivity(intent);
            }
        });

        inspiredCount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, inspired.class);
                intent.putExtra("pid", post_id.get(position));
                intent.putExtra("type", "Inspired");
                activity.startActivity(intent);
            }
        });

        inspireText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, inspired.class);
                intent.putExtra("pid", post_id.get(position));
                intent.putExtra("type", "Inspired");
                activity.startActivity(intent);
            }
        });

        sharesText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, inspired.class);
                intent.putExtra("pid", post_id.get(position));
                intent.putExtra("type", "Shares");
                activity.startActivity(intent);
            }
        });


        profImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppCompatActivity activity = (AppCompatActivity) mContext;
                Initializer initializer = (Initializer) activity.getApplication();
                initializer.setProfilefetchId(user_id.get(position));

                if (initializer.getProfilefetchId().equals(initializer.getuserid())) {
                    initializer.j.selectFragment(5);
                } else {
                    Intent intent = new Intent(mContext, pal_profile.class);
                    mContext.startActivity(intent);
                }
            }
        });

        btninspire.setEventListener(new SparkEventListener()
        {
            @Override
            public void onEvent(ImageView button, boolean buttonState)
            {
                if (buttonState)
                {
                    setInspire(post_id.get(position), initializer.getuserid(), user_id.get(position), "inspired");
                    inspired.set(position, "1");
                    Integer val = Integer.parseInt(inspiredCount.getText().toString());
                    Integer newval = val + 1;
                    myRef.child((post_id.get(position) + " id")).child(post_id.get(position)).child("inspirecount").setValue(Integer.valueOf(newval));

                    //myRef.child(post_id.get(getAdapterPosition()) + " id").child("inspirecount").setValue(newval);

                    myRef.addValueEventListener(new ValueEventListener()
                    {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                        {
                            try
                            {
                                Integer insp = dataSnapshot.child((post_id.get(position) + " id")).child(post_id.get(position)).child("inspirecount").getValue(Integer.class);
                                inspiredCount.setText(String.valueOf(insp));
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });
                }
                else {
                    setInspire(post_id.get(position), initializer.getuserid(), user_id.get(position), "uninspired");
                    inspired.set(position, "0");
                    Integer val = Integer.parseInt(inspiredCount.getText().toString());
                    Integer newval = val - 1;

                    myRef.child((post_id.get(position) + " id")).child(post_id.get(position)).child("inspirecount").setValue(Integer.valueOf(newval));
                    //myRef.child(post_id.get(getAdapterPosition()) + " id").child("inspirecount").setValue(newval);

                    myRef.addValueEventListener(new ValueEventListener()
                    {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                        {
                            try
                            {
                                Integer insp = dataSnapshot.child((post_id.get(position) + " id")).child(post_id.get(position)).child("inspirecount").getValue(Integer.class);
                                inspiredCount.setText(String.valueOf(insp));
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });
                }
            }

            @Override
            public void onEventAnimationEnd(ImageView button, boolean buttonState) {

            }

            @Override
            public void onEventAnimationStart(ImageView button, boolean buttonState) {

            }
        });

        btncomment.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(mContext, comment.class);
                intent.putExtra("pid", post_id.get(position));
                intent.putExtra("p_uid", ns.getId());
                mContext.startActivity(intent);
            }
        });


        btnshare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, sharePost.class);
                intent.putExtra("pid", post_id.get(position));
                mContext.startActivity(intent);
            }
        });

        btnsave.setEventListener(new SparkEventListener() {
            @Override
            public void onEvent(ImageView button, boolean buttonState) {
                if (buttonState) {
                    savePost(post_id.get(position), initializer.getuserid());
                    savedPosts.set(position, "1");
                } else {
                    savePost(post_id.get(position), initializer.getuserid());
                    savedPosts.set(position, "0");
                }
            }

            @Override
            public void onEventAnimationEnd(ImageView button, boolean buttonState) {

            }

            @Override
            public void onEventAnimationStart(ImageView button, boolean buttonState) {

            }
        });


        sUserName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppCompatActivity activity = (AppCompatActivity) mContext;
                Initializer initializer = (Initializer) activity.getApplication();
                initializer.setProfilefetchId(ns.getSharedId());

                if (initializer.getProfilefetchId().equals(initializer.getuserid())) {
                    initializer.j.selectFragment(5);
                } else {
                    Intent intent = new Intent(mContext, pal_profile.class);
                    mContext.startActivity(intent);
                }
            }
        });

        content.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Initializer.viewingPost == false) {
                    if (bids.get(position).equals("null") || bids.get(position).equals("")) {
                        Initializer.viewingPost = true;
                        Intent intent = new Intent(mContext, singlepost.class);
                        intent.putExtra("pid", post_id.get(position));
                        mContext.startActivity(intent);
                    } else {
                        Initializer.viewingPost = true;
                        AppCompatActivity activity = (AppCompatActivity) mContext;
                        Initializer initializer = (Initializer) activity.getApplication();
                        initializer.setProfilefetchId(user_id.get(position));
                        Intent intent = new Intent(mContext, mblog_singleview.class);
                        intent.putExtra("bid", bids.get(position));
                        intent.putExtra("pid", o_s_pid.get(position));
                        mContext.startActivity(intent);
                    }
                } else {
                    //Initializer.viewingPost = false;
                }
            }
        });


        if (!ns.getUserType().equals("user")) {
            verfiedIcon.setVisibility(View.VISIBLE);
        } else {
            verfiedIcon.setVisibility(View.GONE);
        }


        if (ns.getUserimage().equals("")) {
        } else {
            imageLoader.displayImage(ns.getUserimage(), profImg);
            //getImageFromUrl(ns.getUserimage(), profImg);
        }
        //newsfeedViewholder.profImg.setImageDrawable(mContext.getResources().getDrawable(ns.getUserimage()));
        userName.setText(ns.getUsername());

        if (ns.getPostText().equals("")) {
            postText.setVisibility(View.GONE);
        } else {
            postText.setVisibility(View.VISIBLE);
            progressBar.setVisibility(View.GONE);
            postText.setText(ns.getPostText());
        }

        inspiredCount.setText(ns.getInspiredCount());
        commentsCount.setText(ns.getCommentsCount());
        sharesCount.setText(ns.getSharesCount());

        postVid.setVisibility(View.GONE);
        postImg.setVisibility(View.GONE);
        mMediaController.setVisibility(View.GONE);
        viewsCount.setVisibility(View.GONE);
        viewsCountText.setVisibility(View.GONE);

        if (ns.getPostImg().endsWith(".jpg") || ns.getPostImg().endsWith(".jpeg") || ns.getPostImg().endsWith(".png"))
        {
            imageLoader.displayImage(ns.getPostImg(), postImg, new ImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view)
                {
                    //Toast.makeText(mContext, "starting", Toast.LENGTH_SHORT).show();
                    progressBar.setVisibility(View.VISIBLE);
                }

                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason)
                {
                    Toast.makeText(mContext, "failed to load image", Toast.LENGTH_SHORT).show();
                    progressBar.setVisibility(View.GONE);
                }

                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
                {
                    progressBar.setVisibility(View.GONE);
                    postImg.setImageBitmap(loadedImage);
                }

                @Override
                public void onLoadingCancelled(String imageUri, View view)
                {

                }
            });

            //imageLoader.displayImage(ns.getPostImg(), postImg);
            getImageFromUrl(ns.getPostImg(), postImg);
            postImg.setVisibility(View.VISIBLE);

        }
        else if (ns.getPostVid().endsWith(".mp4"))
        {
            final Uri video_url = Uri.parse(ns.getPostVid());
            //progressBar.setVisibility(View.VISIBLE);
            postVid.setVisibility(View.VISIBLE);
            //mMediaController.setVisibility(View.VISIBLE);
            viewsCount.setVisibility(View.VISIBLE);
            viewsCountText.setVisibility(View.VISIBLE);

            SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(getContext(), new DefaultTrackSelector());
            postVid.setPlayer(player);

            //playersArray.add(player);
            DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(), Util.getUserAgent(getContext(), "MotivatorChat"));
            MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(video_url);
            player.prepare(mediaSource);
            player.setPlayWhenReady(false);
            player.addListener(new Player.EventListener()
                 {
                  @Override
                  public void onLoadingChanged(boolean isLoading)
                  {
                      if (!isLoading)
                      {
                          Toast.makeText(mContext, "Ready", Toast.LENGTH_SHORT).show();
                      }
                  }
                  });

                    //postVid.setMediaController(mMediaController);
                    //postVid.setUp(ns.getPostVid(), "" , Jzvd.SCREEN_WINDOW_NORMAL);
        }

        //newsfeedViewholder.postImg //setImageDrawable(mContext.getResources().getDrawable(ns.getPostImg()));

        inspiredCount.setText(ns.getInspiredCount());
        commentsCount.setText(ns.getCommentsCount());
        sharesCount.setText(ns.getSharesCount());
        //viewsCount.setText(ns.getViewCount());

        checkInspire(post_id.get(position), initializer.getuserid(), btninspire);
        checkSave(post_id.get(position), initializer.getuserid(), btnsave);

        myRef.addValueEventListener(new ValueEventListener()
        {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot)
            {
                if (position >= post_id.size())
                {
                    //index not exists
                }
                else
                {
                    Integer insp = dataSnapshot.child((post_id.get(position) + " id")).child(post_id.get(position)).child("inspirecount").getValue(Integer.class);
                    inspiredCount.setText(String.valueOf(insp));

                    Integer comm = dataSnapshot.child((post_id.get(position) + " id")).child(post_id.get(position)).child("commentsount").getValue(Integer.class);
                    commentsCount.setText(String.valueOf(comm));

                    Integer shar = dataSnapshot.child((post_id.get(position) + " id")).child(post_id.get(position)).child("sharescount").getValue(Integer.class);
                    sharesCount.setText(String.valueOf(shar));

                    Integer view = dataSnapshot.child((post_id.get(position) + " id")).child(post_id.get(position)).child("viewscount").getValue(Integer.class);
                    viewsCount.setText(String.valueOf(view));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError)
            {

            }
        });

        return convertView;
    }
android
android-listview
android-exoplayer

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0