gpt4 book ai didi

android - ListView 中的多个 TextureView 呈现不正确的视频

转载 作者:太空狗 更新时间:2023-10-29 15:07:06 26 4
gpt4 key购买 nike

我正在制作一个应用程序,其中我在 ListView 中有多个纹理 View 。我使用的是我一直使用的列表数组适配器,所以我知道我正在正确地回收每个 ListView 项,并且我正在为每个纹理 View 中的视频设置正确的 url。但是,如果我的列表包含三个以上的视频,它们就会开始“复制”自己,这意味着第四个列表项呈现,但视频一而不是视频四在其中呈现。此外,当我向下滚动并向上滚动时,有时我已连接到该纹理 View 的视频资源也会发生变化,就像它们正在被适配器“重新渲染”一样。我不应该回收 View 吗?当前相关代码:

   public class VideoListAdapter extends ArrayAdapter<videoitem>  {

Context context;

int phonewidth;
int videoPlaying =0;

List<MediaPlayer> playerList = new ArrayList();
int pos;

private final ImageDownloader mDownload = new ImageDownloader();
public VideoListAdapter(Context context, int resourceId, List<videoitem> items) {
super(context, resourceId, items);
this.context = context;
phonewidth = context.getResources().getDisplayMetrics().widthPixels;
}


private class ViewHolder {


RelativeLayout wrapper;
InlineVideoPlayer videoPoster;
TextView numberOfLikes;
TextView numberOfDislikes;
ImageView UserIcon;
TextView userName;
TextView created;
ProgressBar p;
LinearLayout l;


}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
final videoitem rowItem = getItem(position);
pos = position;

LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);



if (convertView == null) {
convertView = mInflater.inflate(R.layout.videoitem,parent, false);
holder = new ViewHolder();


holder.wrapper = (RelativeLayout) convertView.findViewById(R.id.videoholder);
holder.l = (LinearLayout) convertView.findViewById(R.id.inlineVideoPlayer1);
// holder.videoPoster.setVideo("http//hub60.com/app/videos/" + rowItem.getVideo());
holder.UserIcon = (ImageView) convertView.findViewById(R.id.imageView1);
holder.numberOfDislikes = (TextView) convertView.findViewById(R.id.textView3);
holder.numberOfLikes = (TextView) convertView.findViewById(R.id.ratinglikes);
holder.created = (TextView) convertView.findViewById(R.id.textView2);
holder.userName = (TextView) convertView.findViewById(R.id.textView1);

holder.numberOfDislikes.setText(Integer.toString(position));
holder.numberOfLikes.setText(rowItem.getLikes());
holder.userName.setText(rowItem.getVideo());
holder.created.setText(rowItem.getCreated());
mDownload.download(rowItem.getIcon(), holder.UserIcon, null);
holder.l.getLayoutParams().height = phonewidth;

// vid.setLayoutParams(new LayoutParams(
// LayoutParams.MATCH_PARENT,
// LayoutParams.MATCH_PARENT));


convertView.setTag(holder);
} else{
holder = (ViewHolder) convertView.getTag();

holder.numberOfDislikes.setText(Integer.toString(position));
holder.numberOfLikes.setText(rowItem.getLikes());
holder.userName.setText(rowItem.getVideo());
holder.created.setText(rowItem.getCreated());
mDownload.download(rowItem.getIcon(), holder.UserIcon, null);

convertView.setId(position);


}



InlineVideoPlayer vid = new InlineVideoPlayer(rowItem.getVideo(),context);
((LinearLayout) holder.l).addView(vid);
return convertView;
}

在这种特殊情况下,我将其从 if/else 中取出来决定 holder 是否为空,并在最后添加了相关 View 。但是,我在 if/else 语句中也有它,并且仍然遇到相同的行为。

自定义纹理 View 类

public class InlineVideoPlayer  extends TextureView implements SurfaceTextureListener{
Context context;
MediaPlayer mp;
String url;
Surface surface;
SurfaceTexture s;

public InlineVideoPlayer(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
}


public InlineVideoPlayer(String ur,Context context)
{
super(context);
this.setSurfaceTextureListener(this);
this.url = ur;
this.context = context;
// startVideo();
//Log.d("url",this.url);
}

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int arg1, int arg2) {

this.s = surface;

Log.d("url",this.url);
startVideo(surface);

}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {

return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2) {
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
}

public void setVideo(String url)
{
this.url = url;

}

public void startVideo(SurfaceTexture t)
{

this.surface = new Surface(t);
this.mp = new MediaPlayer();
this.mp.setSurface(this.surface);
try {
Uri uri = Uri.parse(this.url);
this.mp.setDataSource(this.context, uri);
this.mp.prepareAsync();
this.mp.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {

mp.setLooping(true);
mp.seekTo(2000);
mp.start();
// mp.pause();

}
});



} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {

} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
try {

} catch (IllegalStateException e) {
e.printStackTrace();
}




}

提前谢谢你

最佳答案

答案是:这是不可能的,开发人员必须使用可重复使用的单元格,并在适当单元格的正确索引处插入一个电影播放器​​,并且在创建单元格时清空当前正在播放的媒体播放器

关于android - ListView 中的多个 TextureView 呈现不正确的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20923380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com