2016-05-12 18 views
1

私のアプリがListViewあり、各行はTextViewタイマーTextView秒ごとに更新するために、私はlistAdapter.notifyDataSetChanged()により、各行をリフレッシュタイマと、各行notifyDataSetChanged AndroidのListViewコントロールとVideoView

でビデオプレーヤー(ExoMediaPlayer)を実行しているが含まれています。下のコードに示すように正常に動作します。

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は時間毎秒更新されます。 しかし、私が直面している問題は、notifyDataSetChanged()のビデオをリストビューで再生したのに、TextViewが更新されないと、VideoPlayerが毎秒再読み込みされているため、ビデオが再生されませんでした。HListAdapter.notifyDataSetChanged();

TextViewタイマーを毎秒更新/更新する可能性があります。 問題を解決してビデオを再生し、毎秒タイマーを更新するロジックや方法はありますか?

+0

notifyDataSetChanged()の必要なしで行きますか? 'HListAdapter'はそれを処理する必要があります。私はあなたが最初にリストビューアのアダプタについての詳細を読むべきだと思う –

+0

私は、テキストビュー上で実行しているタイマーがあります。毎秒私はテキストビューの残りの時間を更新しています。 – Naz141

+0

あなたもアダプタコードを共有することができます –

答えて

0

updateTextViewメソッドのロジックが間違っていると思います。私のコメントは

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

関連する問題