【问题标题】:notifyDataSetChanged Android ListView and VideoViewnotifyDataSetChanged Android ListView 和 VideoView
【发布时间】:2016-05-12 11:06:07
【问题描述】:

我的应用有一个ListView,每行包含一个TextView,每行运行一个计时器和一个视频播放器 (ExoMediaPlayer)

我通过listAdapter.notifyDataSetChanged() 刷新每一行以每秒更新计时器TextView。它工作正常,如下面的代码所示。

Thread t = new Thread() {
        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(1000);
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            updateTextView();
                        }
                    });
                }
            } catch (InterruptedException e) {
        }
    }
};
t.start();

private void updateTextView() {
    if (listView != null) {
        for (int i = 0; i <= listView.getListChildCount(); i++) {
            View v = listView.getListChildAt(i);
            if (v != null) {
                 for(int x=firstVisibleRow;i<=lastVisibleRow;i++)
                {
                    HomeListItem data;
                    data = listMockData.get(i);
                    HListAdapter.notifyDataSetChanged();
                    TextView t = (TextView) v.findViewById(R.id.tvTimer);                        
                    t.setText(data.getElapsedTime());
                }                               
            }
        }
    }
}

适配器

public HListAdapter(Context context, ArrayList<HomeListItem> listData) {
    c = context;
    layoutInflater = LayoutInflater.from(context);
    this.listData = listData;

}
@Override
public int getCount() {
    return listData.size();
}

@Override
public Object getItem(int position) {
    return listData.get(position);
}

@Override
public long getItemId(int position) {
    return listData.indexOf(getItem(position));
}

public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    newsItem = listData.get(position);
    if (convertView == null) {
        holder = new ViewHolder();

        convertView = layoutInflater.inflate(R.layout.location_list_row, null);
        holder.timer= (TextView) convertView.findViewById(R.id.timer);
        holder.videoPlayer = (EMVideoView) convertView.findViewById(R.id.videoPlayer);
        convertView.setTag(holder);
    }

    else {
        holder = (ViewHolder) convertView.getTag();
    }
    newsItem = listData.get(position);

    holder.timer.setText(newsItem.getElapsedTime()); 
    String videolink = "http://www.someurl.com/";
    holder.videoPlayer.setVideoURI(Uri.parse(videolink ));
            holder.videoPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    holder.videoPlayer.start();
                }
            });      

    return convertView;
}

static class ViewHolder {
    TextView timer;
    EMVideoView videoPlayer;
}

问题

上面的代码运行良好,定时器TextView每秒更新一次时间。 但我面临的问题是每秒钟都在重新加载 VideoPlayer,由于HListAdapter.notifyDataSetChanged();,视频无法播放 如果我删除列表视图上播放的notifyDataSetChanged() 视频,但计时器TextView 没有得到更新。

仅每秒刷新/更新TextView 计时器的任何可能性。 有什么逻辑或方法可以解决这个问题并使视频播放以及每秒更新的计时器吗?

【问题讨论】:

  • 你为什么要自己更新文本? HListAdapter 应该注意这一点。我认为你应该先阅读更多关于 ListView 适配器的内容
  • 我在 textview 上运行了一个计时器。每秒我都在更新文本视图中的剩余时间。
  • 你也可以分享你的适配器代码
  • @RickSanchez 现在您可以在我的问题中看到适配器代码
  • 你应该使用 Timer 类来每秒更新时间

标签: android listview timer baseadapter


【解决方案1】:

我认为您在 updateTextView 方法中的逻辑是错误的。看我的cmets

private void updateTextView() {
    if (listView != null) {
        for (int i = 0; i <= listView.getListChildCount(); i++) {
            View v = listView.getListChildAt(i);
            if (v != null) {
                 for(int x=firstVisibleRow;i<=lastVisibleRow;i++)  // what is x here ?!!
                {
                    HomeListItem data;
                    data = listMockData.get(i);
                    HListAdapter.notifyDataSetChanged();
                    TextView t = (TextView) v.findViewById(R.id.tvTimer);                        
                    t.setText(data.getElapsedTime());    // here you are setting the same text over and over
                }                               
            }
        }
    }
}

改用这个

private void updateTextView() {
        if (listView != null) {
            for (int i = 0; i < listView.getListChildCount(); i++) {
                View v = listView.getListChildAt(i);
                HomeListItem data;
                data = listMockData.get(firstVisibleRow + i);
                TextView t = (TextView) v.findViewById(R.id.tvTimer);
                t.setText(data.getElapsedTime());
            }
        }
    }

不需要notifyDataSetChanged()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2013-01-08
    • 2011-09-16
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多