3

What I'm trying to do is to populate a ListView with a BaseAdapter which has a TextureView in it. The problem is i don't see any video playing before waiting at least 2 mins, and its not about my internet connection speed. When i set the width of TextureView to 300dp, my ListView starts containing more than one view and all of the views start playing the video creating a chaos. I want my program to work like Vime or Instapram applications, auto-starting when it has focus(or visible), and pause when i scroll. I had an 5 hours of search in web and still nothing. Any guide, help, sample code will be appreciated. Thanks in advance.

public class VideoAdapter extends BaseAdapter {
private Activity context;
private ArrayList<String> urls;
private MediaPlayer mediaPlayer;

public VideoAdapter(Activity context, ArrayList<String> urls) {
    this.context = context;
    this.urls = urls;

}

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

@Override
public Object getItem(int position) {
    return urls.get(position);
}

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

@Override
public View getView(int positionx, View convertView, ViewGroup parent) {
    final ViewHolderItems viewHolderItems;
    SurfaceHolder surfaceHolder;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.single_video_item, parent, false);
        viewHolderItems = new ViewHolderItems();
        viewHolderItems.textureView = (TextureView) convertView.findViewById(R.id.textureView);
        convertView.setTag(viewHolderItems);
    }else{
        viewHolderItems = (ViewHolderItems) convertView.getTag();
    }
    final int position = positionx;
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)viewHolderItems.textureView.getLayoutParams();
    params.height = 850;
    params.width = LinearLayout.LayoutParams.MATCH_PARENT;
    viewHolderItems.textureView.setLayoutParams(params);
    mediaPlayer = new MediaPlayer();
    viewHolderItems.textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
            mediaPlayer.setSurface(new Surface(surface));
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                mediaPlayer.setDataSource(urls.get(position));
                Log.d("JWP", "" + urls.get(position));
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            /*mediaPlayer.stop();
            mediaPlayer.release();*/
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        }
    });

    return convertView;
}
static class ViewHolderItems{
    TextureView textureView;
}
}

I don't have any crashes, but errors still come up:

E/MediaPlayer﹕ attachNewPlayer called in state 4
W/System.err﹕ java.lang.IllegalStateException
W/System.err﹕ at android.media.MediaPlayer.nativeSetDataSource(Native Method)
W/System.err﹕ at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1061)
W/System.err﹕ at android.view.TextureView.getHardwareLayer(TextureView.java:370)
W/System.err﹕ at android.view.View.updateDisplayListIfDirty(View.java:14025)
W/System.err﹕ at android.view.View.getDisplayList(View.java:14071)
W/System.err﹕ at android.view.View.draw(View.java:14838)
W/System.err﹕ at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
W/System.err﹕ at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
W/System.err﹕ at android.view.View.updateDisplayListIfDirty(View.java:14043)
W/System.err﹕ at android.view.View.getDisplayList(View.java:14071)
W/System.err﹕ at android.view.View.draw(View.java:14838)
eden
  • 5,876
  • 2
  • 28
  • 43
  • first try usesetup a single TextureView and when you are sure it is working fine try to add multiple TextureViews in the ListView – pskink Feb 27 '15 at 22:25
  • Single one probably work just fine. My requirements meet when there are more than just one; enabling scrolling and observing pause and auto-start, without any delay of loading whole video from url. Thank you for your reply – eden Feb 27 '15 at 22:33
  • probably? make sure it will work for sure, not probably – pskink Feb 27 '15 at 22:36
  • As i mentioned in the question, when i have multiple textureviews with mediaplayers, they all start playing the video from url. Playing only one is really OK, and there are few clear examples on web. But i cant figure out how to use it in an adapter which doesn't have onDestroy(), causing another problem of resource management. This implementation is hard but popular, i want to know how they do it. – eden Feb 27 '15 at 22:41
  • IllegalStateException indicates that there is something wrong with your MediaPlayer setup, that's why i recommend first using simple TextureView/MediaPlayer, if it works really ok try to play with AbsListView.OnScrollListener – pskink Feb 27 '15 at 22:52
  • @pskink what about using viewpager with vertical scroll? Maybe fragmentpageradapter can be used since fragments have create-destroy states? – eden Feb 28 '15 at 09:07
  • i agree its definitely better to use a view pager since it shows one item per screen – pskink Feb 28 '15 at 09:09
  • Thank you for your help :) one last question, fragmentpageradapter or viewpageradapter? I cant imagine how am i supposed to use more than 10 fragments at recyling – eden Feb 28 '15 at 09:13
  • if you are familiar with fragments use fragmentpageradapter, viewpageradapter needs some more extra stuff – pskink Feb 28 '15 at 09:15
  • I have same problem .. have you got any solution to your question ? – Amr Mohammed Oct 22 '15 at 09:58
  • Unfortunetly i couldn't – eden Oct 22 '15 at 10:08

0 Answers0