2015-02-20 25 views
6

Tôi có một VideoView bên trong RecyclerView. Tôi muốn cuối cùng có một danh sách các video để chơi trên Recyclerview. Tôi quyết định bắt đầu với một video, sau đó chuyển sang có nhiều video. Tôi không thể có được một video để phát trong Recyclerview. Khi tôi khởi động ứng dụng trên điện thoại của mình, tất cả những gì tôi nhận được là thanh tiến trình. Hàm onPrepared không bao giờ được gọi vì một lý do nào đó. Đây là mã của tôi.Gặp sự cố khi phát video trên 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> 

Bất kỳ ý tưởng nào? Tệp video là tệp .3gp. Cảm ơn!

Trả lời

11

Tôi đã bị mắc kẹt về vấn đề này quá lâu. Sau khi tìm kiếm ở khắp mọi nơi và vẫn còn đấu tranh tôi nhìn vào cơ sở mã cũ của tôi với chính xác cùng một mã vạch một sự khác biệt. Các VideoView đã có chiều cao của nó lập trình thiết lập. android:layout_height="wrap_content" dường như không thực hiện điều chỉnh độ cao.

Vì vậy, tôi đã sử dụng phương pháp tiện ích tự tạo để có chiều rộng màn hình và đặt chiều cao ở tỷ lệ 16: 9 như vậy. (Có lẽ chỉ cần thiết lập chiều cao và chiều rộng của bạn để một số con số tùy ý đầu tiên để xem nếu nó là vấn đề)

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

Sau đó, tất cả phải mất là để thiết lập chiều cao VideoViews như vậy

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

LƯU Ý: My chiều rộng được đặt thành match_parent, vì vậy wrap_content cũng có thể không hoạt động ở đó.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn, việc đặt chiều cao thành giá trị cố định đầu tiên đã giúp tôi giải quyết vấn đề tôi gặp với videoviews bên trong recyclerview! –

0

vấn đề là với

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

trước khi video được nạp giá trị của họ là từ 0 đến giải quyết vấn đề này có thể sử dụng thiết minheight để 1dplayout_width để match_parent và ý chí này làm các trick, bạn không cần cố định chiều rộng và chiều cao.

Các vấn đề liên quan