我在RecyclerView中有一个VideoView.我想最终有一个可在Recyclerview上播放的视频列表.我决定从一个视频开始,然后继续制作多个视频.我似乎无法在Recyclerview中播放一个视频.当我在手机上启动应用程序时,我得到的只是进度条.由于某种原因,永远不会调用onPrepared函数.这是我的代码.
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>
解决方法
我也被困在这个问题上太久了.在搜索到任何地方并仍在努力之后,我用完全相同的代码栏查看了我的旧代码库,区别一点. VideoView的编程高度是以编程方式设置的. android:layout_height =“wrap_content”似乎没有进行高度调整.
所以我使用自制的实用方法来获得屏幕宽度,并将高度设置为16:9比例. (也许只是先将你的身高和宽度设置为任意数字,看是否是问题)
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; }
然后,只需设置VideoViews高度即可
holder.mVideoView.getLayoutParams().height = getScreenWidth(mContext) * 9 /16;
注意:我的宽度设置为match_parent,因此wrap_content也可能在那里失败.
希望这可以帮助.