我遇到的ListView 列表内播放视频 非常卡顿的一个问题

项目需求。一个页面内有的其他不少组件包括banner 和 几个 TextView ,下部是一个listView ,ListView 里面包含视频。可以播放。放大播放。整体可以下拉刷新。 

实现思路:使用带下拉刷新的ScrollView ,内部嵌套需要的组件。出现了一个问题。此时 ListView  是显示不全的。解决办法有2个。

方法1:

第一种方法:写一个方法重新测量高度并设置给listview即可。 
  

 public static void setListViewHeightBasedOnChildren(ListView listView) {
    //获得adapter
        MyAdapter adapter = (MyAdapter) listView.getAdapter();
        if (adapter == null) {
            return;
        }

        int totalHeight = 0;
        for (int i = 0; i < adapter.getCount(); i++) {
            View listItem = adapter.getView(i, null, listView);
            listItem.measure(0, 0);
            //计算总高度
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        //计算分割线高度
        params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
        //给listview设置高度
        listView.setLayoutParams(params);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在设置完adapter后调用下这个方法即可。

     MyAdapter adapter = new MyAdapter();
     listview.setAdapter(adapter);
     setListViewHeightBasedOnChildren(listview);

第二种方法:就是自定义一个ListView重写onMeasure方法

package com.sy.mylistview;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
 * Created by SY on 2016/6/15.
 */
public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //重新设置高度
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
俩种方法都可以, 俩种方法有什么实质性的不同?不太懂。我选择了第二种方法处理上面的问题。。

视频播放选择的是网上的demo ,有很多。可以自行百度。我选择了其中一种放到项目里。

地址是:https://github.com/lipangit/JiaoZiVideoPlayer  git上 Star  达到了 5000+。它的原理是Media+TextureView 来实现的。

实际运行中发现。。视频播放以后。视频卡顿。反应延迟。ListView 根本划不动。有木有?WHY?

解决办法:

1:视频组件选择的有问题?更换其他视频播放组件。?。未解决。并且demo里面的列表播放视频 没问题啊。

 2、手机配置问题。?所有手机都有这种问题。。Demo里面没问题啊。

3、下拉刷新组件影响? 去掉这个组件 发现依旧不管用

最后的结果就是 不管怎么弄 。。问题依旧没有解决。。后来 经过大量 、一点点功能拆分测试。。

发现问题出在了ListView上。我用的ListView是自定义的。修改为Android  原生ListView 。 然后采用第一种方法 设置ListView 的高度。发现问题解决了。

但是为什么会有这样的问题。。依旧不知道原因。。。。。。。





猜你喜欢

转载自blog.csdn.net/a872822645/article/details/78753067