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)