2016-07-14 4 views
3

У нас возникла проблема с тем, что содержимое HorizontalScrollview не обновляется динамически. В первый раз при вызове функции ниже правильно настройте содержимое прокрутки (Called from onCreate). Но со следующего раза макет не обновляется (в основном вызов функции после некоторых новых загрузок выполняется в фоновом режиме). playlist_scroll - это HorizontalScrollView, в котором мы имеем LinearLayout playlist_content, к которому добавляются элементы (завышенные из partial_main_playlist).Android: содержимое HorizontalScrollview не обновляется Динамически

HorizontalScrollView playlist_scroll = (HorizontalScrollView) findViewById(R.id.playlist_scroll); 
LinearLayout playlist_content = (LinearLayout) findViewById(R.id.playlist_content); 

private void setPlaylistNameScroll(List<Playlist> result) { 
    if (result != null && result.size() > 0) { 
     playlist_row_position = 0; 
     playlists = result; 
     playlist_content.removeAllViews(); 
     for (Playlist playlist : playlists) { 
      playlist_ll = (LinearLayout) getLayoutInflater().inflate(R.layout.partial_main_playlist, playlist_content, false); 
      playlist_ll.setTag(playlist.getId()); 
      Log.d(TAG, "setPlaylistNameScroll - playlist " + playlist.getName()); 
      if (border != null && !border.equals("")) { 
       playlist_ll.setBackgroundColor(Color.parseColor("#" + border)); 
      } 
      playlist_row = (LinearLayout) playlist_ll.findViewById(R.id.playlist_row); 
      LinearLayout.LayoutParams playlist_row_params = (LinearLayout.LayoutParams) playlist_row.getLayoutParams(); 
      playlist_row_params.width = playlist_row_width; 
      playlist_row_params.height = playlist_row_height; 
      playlist_row.setLayoutParams(playlist_row_params); 
      playlist_row_item = (LinearLayout) playlist_ll.findViewById(R.id.playlist_row_item); 
      if (playlist_bg_bitmap_draw != null) { 
       playlist_row_item.setBackground(playlist_bg_bitmap_draw); 
      } 
      playlist_tv = (TextView) playlist_ll.findViewById(R.id.playlist_tv); 
      String _playlist_name = playlist.getName(); 
       playlist_tv.setText(_playlist_name); 
      playlist_tv.setTextColor(Color.parseColor("#" + playlist_title_color)); 
      playlist_ll.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        switch (event.getAction()) { 
         case MotionEvent.ACTION_DOWN: 
          v.startAnimation(btn_click_animation); 
          break; 
        } 
        return false; 
       } 
      }); 
        playlist_content.addView(playlist_row, playlist_row_position++); 

     } 
     playlist_scroll.post(new Runnable() { 
      public void run() { 
       if(playlist_content.getParent() != null) 
       { 
        ((ViewGroup)playlist_content.getParent()).removeView(playlist_content); 
       } 
       playlist_scroll.addView(playlist_content); 
      } 
     }); 
    } 
} 

partial_main_playlist.xml выглядит следующим образом

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:id="@+id/playlist_row" 
    android:clickable="true" 
    android:onClick="playlistClicked" 
    android:background="@color/colorDefaultBg"> 
    <LinearLayout 
     android:id="@+id/playlist_row_item" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:layout_margin="@dimen/resource_row_margin" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/playlist_tv" 
      android:layout_width="0dip" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.9" 
      android:textAlignment="center" 
      android:ellipsize="marquee" 
      android:maxLines="1" 
      android:textStyle="bold" 
      android:gravity="center" 
      android:layout_gravity="center_vertical" 
      android:text="Playlist" 
      android:textColor="@color/colorDefaultText" 
      android:textSize="@dimen/playlist_scroll_title_font" /> 
     <ImageView 
      android:id="@+id/playlist_status" 
      android:layout_width="0dip" 
      android:layout_height="match_parent" 
      android:layout_weight="0.1" 
      android:layout_gravity="end" 
      android:gravity="center" 
      android:scaleType="center" 
      android:visibility="invisible" 
      android:src="@drawable/shuffle"/> 
    </LinearLayout> 
</LinearLayout> 

We have referred the answer here and implemented the above code

метод setPlaylistNameScroll вызывается из ReceiveResult на Сервис загрузки, как этот

public void onReceiveResult(int resultCode, Bundle resultData) { 
    String error; 
    switch (resultCode) { 
     case DownloadService.STATUS_RUNNING: 
      media_syncing = true; 
      Log.d(TAG, "DownloadService.STATUS_RUNNING"); 
      break; 
     case DownloadService.STATUS_FINISHED: 
      Log.d(TAG, "DownloadService.STATUS_FINISHED"); 
      setPlaylistNameScroll(databaseHandler.getDevicePlaylists(device_id, playlist_ordering)); 
      break; 
     case DownloadService.STATUS_ERROR: 
      media_syncing = false; 
      error = resultData.getString(Intent.EXTRA_TEXT); 
      Log.d(TAG, "DownloadService.STATUS_ERROR " + error); 
      break; 
     case DownloadService.STATUS_STOPPED: 
      media_syncing = false; 
      error = resultData.getString(Intent.EXTRA_TEXT); 
      Log.d(TAG, "DownloadService.STATUS_STOPPED " + error); 
      break; 
    } 
} 
+0

Вы ничего не упомянули о горизонтальном прокрутке в вашем коде. – chandil03

+0

@ chandil03 Извините, playlist_scroll - это HorizontalScrollView, в котором у нас есть Linlingayout playlist_content, к которому мы добавляем элементы. См. Мой отредактированный вопрос. –

+0

где ваш код загрузки? или код, в котором вы обновляете контент в linearLayout внутри scrollView. – chandil03

ответ

0

Мы читаем в Google Doc , другие учебные пособия, что любое обновление для hori Содержимое zontalscrollview должно происходить из потока пользовательского интерфейса. Таким образом, мы устанавливаем приемник как

mReceiver = new DownloadResultReceiver(new Handler());  
mReceiver.setReceiver(this); 

Как в моем понимании «новый Handler()» будет убедиться, что результат приемника вызовов метода будет выполняться в потоке пользовательского интерфейса. Но, к сожалению, это было не так в нашем случае по крайней мере в Android 5.1.1 API Level 22, в другой версии мы этого не наблюдали. Наконец, мы закончили что-то вроде runnable, который будет проверять, будет ли новая версия, если она обновит горизонтальную прокрутку.

Runnable refreshChecker = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      int save_media_called = databaseHandler.getSave_media_called();        
      if (save_media_called_log != save_media_called && save_media_called != 0) {     setPlaylistNameScroll(databaseHandler.getDevicePlaylists(device_id, playlist_ordering)); 
       save_media_called_log = save_media_called; 
      } 
     } finally { 
      refreshHandler.postDelayed(refreshChecker, refresh_check_interval); 
      refresh = true; 
     } 
    } 
}; 
Смежные вопросы