Problem playing video on Recyclerview

I have a VideoView inside a RecyclerView. In the end, I have a list of videos to play on Recyclerview. I decided to start with one video, then move on to creating several videos. It seems I can not play one video in Recyclerview. When I run the application on my phone, all I get is a progress bar. The onPrepared function is never called for some reason. Here is my code.

RecyclerActivity.java

import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.view.Menu; import android.view.MenuItem; import android.support.v7.widget.RecyclerView; public class RecyclerActivity extends ActionBarActivity { private RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new MyAdapter(this); mRecyclerView.setAdapter(mAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_recycler, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

Myadapter.java

 import android.app.ProgressDialog; import android.content.Context; import android.media.MediaPlayer; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.MediaController; import android.widget.TextView; import android.widget.VideoView; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private ProgressDialog progressDialog; private MediaController mediaControls; public static class ViewHolder extends RecyclerView.ViewHolder{ public VideoView mVideoView; public ViewHolder(View v){ super(v); mVideoView = (VideoView) v.findViewById(R.id.video_view); } } public MyAdapter(Context mContext) { context = mContext; mediaControls = new MediaController(context); progressDialog = new ProgressDialog(context); progressDialog.setTitle("Random Video"); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); progressDialog.show(); } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_video_view, parent,false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { try{ holder.mVideoView.setMediaController(mediaControls); holder.mVideoView.setVideoURI(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.kitkat)); } catch (Exception e){ Log.e("Error", e.getMessage()); e.printStackTrace(); } holder.mVideoView.requestFocus(); holder.mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { progressDialog.dismiss(); holder.mVideoView.start(); } }); } @Override public int getItemCount() { return 1; } 

my_video_view.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" tools:context=".RecyclerActivity"> <VideoView android:id="@+id/video_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> </FrameLayout> 

activity_recycler.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".RecyclerActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> 

Any ideas? By the way, the video file is a .3gp file. Thanks!

+6
source share
2 answers

I lingered on this for too long. After searching everywhere and still struggling, I looked at my older code base with the same code string. VideoView had software climb. android:layout_height="wrap_content" does not match the height setting.

So, I used my own utility method to get the width of the screen and set the height to 16: 9. (Maybe just set the height and width for some arbitrary numbers to see if this is a problem)

 public static int getScreenWidth(Context c) { int screenWidth = 0; // this is part of the class not the method if (screenWidth == 0) { WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenWidth = size.x; } return screenWidth; } 

Then all that is required is to set the height of the VideoViews as such

 holder.mVideoView.getLayoutParams().height = getScreenWidth(mContext) * 9 /16; 

NOTE. My width is set to match_parent , so wrap_content may also not work there.

Hope this helps.

+11
source

a problem with

 android:layout_width="wrap_content" android:layout_height="wrap_content" 

before downloading the video, their values ​​are 0, to solve this problem, you can use set minHeight to 1dp and layout_width to match_parent and this will do the trick, you do not need a fixed width and height.

0
source

Source: https://habr.com/ru/post/982764/


All Articles