2015-02-20 1 views
6

У меня есть VideoView внутри RecyclerView. В конце концов, у меня есть список видео для воспроизведения на Recyclerview. Я решил начать с одного видео, затем перейду к созданию нескольких видеороликов. Кажется, я не могу воспроизвести одно видео в Recyclerview. Когда я запускаю приложение на своем телефоне, все, что я получаю, это индикатор выполнения. Функция onPrepared никогда не вызывается по какой-то причине. Вот мой код.Неисправность получения видео для воспроизведения на Recyclerview

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> 

Любые идеи? Кстати, файл видео является файлом .3gp. Благодаря!

ответ

11

Я был застрял на этом слишком долго. После поиска повсюду и все еще борется, я смотрел на свою старшую кодовую базу с одной и той же кодовой строкой. У 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 также может не работать.

Надеюсь, это поможет.

+0

Благодарим вас, установив высоту в фиксированное значение, сначала помогло мне решить проблему, с которой я столкнулся в видеообъявлении внутри recycliewiew! –

0

проблема с

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

перед загрузкой видео их значения 0, чтобы решить эту проблему можно использовать множество MinHeight к 1DP и layout_width к match_parent и это сделайте трюк, вам не нужна фиксированная ширина и высота.