2015-02-20 14 views
6

Ho una visualizzazione video all'interno di RecyclerView. Voglio alla fine avere un elenco di video da riprodurre su un Recyclerview. Ho deciso di iniziare con un video, quindi passare ad avere più video. Non riesco a ottenere un video da riprodurre nel Recyclerview. Quando avvio l'app sul mio telefono, tutto ciò che ottengo è la barra di avanzamento. La funzione onPrepared non viene mai chiamata per qualche motivo. Ecco il mio codice.Problemi di riproduzione dei video su 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> 

Qualche idea? A proposito, il file video è un file .3gp. Grazie!

risposta

11

Sono rimasto bloccato per troppo tempo. Dopo aver cercato ovunque e ancora lottando, ho guardato il mio vecchio codice con la stessa identica barra del codice una differenza. VideoView stava impostando la sua altezza programmata. android:layout_height="wrap_content" non sembra effettuare una regolazione in altezza.

Quindi ho utilizzato un metodo di utilità self-made per ottenere la larghezza dello schermo e impostare l'altezza in modo che fosse in un rapporto 16: 9 in questo modo. (Forse solo impostare l'altezza e la larghezza di alcuni numeri arbitrari prima per vedere se è il problema)

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; 
} 

Poi tutto quello che serve è quello di impostare l'altezza VideoViews come tale

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

NOTA: Il mio la larghezza è impostata su match_parent, pertanto anche wrap_content potrebbe non riuscire.

Spero che questo aiuti.

+0

Grazie, impostare l'altezza su un valore fisso per primo mi ha aiutato a risolvere il problema che avevo con le videoviste all'interno di una raccolta differenziata! –

0

il problema è con

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

prima che il video è caricato i loro valori sono 0 per risolvere questo problema può utilizzare impostare MinHeight a 1DP e layout_width a match_parent e questa volontà fai il trucco, non hai bisogno di larghezza e altezza fisse.

Problemi correlati