2016-05-12 10 views
1

Meine App hat eine ListView und jede Zeile enthält eine TextView einen Timer und einen Video-Player läuft (ExoMediaPlayer) in jeder ZeilenotifyDataSetChanged Android Listview und Videoview

ich jede Zeile aktualisieren, indem listAdapter.notifyDataSetChanged() den Timer TextView jede Sekunde zu aktualisieren. Es funktioniert gut, wie im folgenden Code gezeigt.

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

Adapter

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

Problem

Der obige Code funktioniert gut und der Timer TextView aktualisiert die jedes zweite Mal. Aber das Problem, mit dem ich konfrontiert bin, ist der VideoPlayer wird jede Sekunde neu geladen, das Video nicht wegen HListAdapter.notifyDataSetChanged(); Wiedergabe, wenn ich die notifyDataSetChanged() Videospiele auf der ListView entfernt, aber der Timer TextView wird nicht aktualisiert.

Jede Möglichkeit zum Aktualisieren/Aktualisieren des Timers TextView nur jede Sekunde. Jede Logik oder Methode, um das Problem zu lösen und das Videospiel zu machen und auch den Timer jede Sekunde aktualisiert werden?

+0

Warum aktualisieren Sie den Text selbst? 'HListAdapter' sollte darauf achten. Ich denke, Sie sollten zuerst ein wenig mehr über ListView-Adapter lesen –

+0

Ich habe einen Timer auf der Textansicht läuft. jede Sekunde aktualisiere ich die verbleibende Zeit in der Textansicht. – Naz141

+0

können Sie auch Ihren Adapter Code teilen –

Antwort

0

Ich denke, Ihre Logik in updateTextView-Methode ist falsch. Sehen Sie meine Kommentare

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

Stattdessen gehen Sie mit diesem

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

keine Notwendigkeit von notifyDataSetChanged()