4

Если я вызываю notifyDataSetChanged() на пользовательский адаптер, связанный с моим ListView, все представления должны обновляться сами (getView() будет вызываться). Теперь у меня есть BroadcastReceiver, который слушает событие. Когда событие срабатывает, ListView должен быть обновлен. Как я могу это достичь? Спасибо!Как обновить ListView от BroadcastReceiver?

+0

«Теперь у меня есть BroadcastReceiver, который слушает событие» - что такое событие и как зарегистрирован «BroadcastReceiver» (манифест или «registerReceiver()»)? – CommonsWare

+0

Привет, динамически зарегистрированный в Activity, который содержит ListView, событие ACTION_DOWNLOAD_COMPLETE из DownloadManager. – Angelo

+1

в режиме onReceive of BroadcastReceiver вам необходимо: изменить базовые данные вашего пользовательского адаптера и вызвать notifyDataSetChanged или создать новый пользовательский адаптер и установить его в listview – Selvin

ответ

2

Если обновить ListView из приемника вы будете иметь такой код:

BroadcastReceiver br; 
public final static String BROADCAST_ACTION = "BROADCAST_ACTION"; 
br = new BroadcastReceiver() { 
public void onReceive(Context context, Intent intent) { 
//code refreshing... 
} 
}; 
IntentFilter intFilt = new IntentFilter(BROADCAST_ACTION); 
registerReceiver(br, intFilt); 

И вы называете это с кодом:

Intent intent = new Intent(BROADCAST_ACTION); 
sendBroadcast(intent); 

Если вам нужно обновление, чтобы быть еще одно действие вы просто необходимо добавить (после действия):

Intent intent = new Intent(BROADCAST_ACTION); 
sendBroadcast(intent); 
+0

Не работает должным образом. Пожалуйста, уточните свой ответ. –

1

В соответствии с просьбой см. пример кода:

public interface OnDataUpdateListener { 
    void onDataAvailable(ArrayList<String> newDataList); 
} 

public class MyTestReceiver extends BroadcastReceiver { 
    public static final String DATA_LIST = "DATA_LIST"; 
    private OnDataUpdateListener mDataUpdateListener = null; 
    public MyTestReceiver(OnDataUpdateListener dataUpdateListener) { 
     mDataUpdateListener = dataUpdateListener; 
    } 

    @Override 
    public void onReceive(Context ctx, Intent intent) { 
     // assuming data is available in the delivered intent 
     ArrayList<String> dataList = intent.getSerializableExtra(DATA_LIST); 
     if (null != mDataUpdateListener) { 
      mDataUpdateListener.onDataAvailable(dataList); 
     } 
    } 
} 

public class MyActivity extends FragmentActivity implements OnDataUpdateListener { 
    public static final String ACTION_DATA_UPDATE_READY = "ACTION_DATA_UPDATE_READY"; 
    private MyTestReceiver mTestReceiver = null; 
    private <SomeAdapterClass> mAdapter = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // other required initialization 
     mTestReceiver = new MyTestReceiver(this); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (null != mTestReceiver) { 
      registerReceiver(mTestReceiver, new IntentFilter(ACTION_DATA_UPDATE_READY)); 
     } 
    } 

    void onDataAvailable(ArrayList<String> newDataList) { 
     // assuming you want to replace existing data and not willing to append to existing dataset 
     mAdapter.clear(); 
     mAdapter.addAll(newDataList); 
     mAdapter.notifyDataSetChanged(); 
    } 
} 
0

В коде, где ваши данные обновляется, выпалить сообщение сигнализации, что данные были изменены ... (Вы должны иметь доступ к любой деятельности или в контексте приложения, чтобы сделать это)

Intent intent = new Intent("ListViewDataUpdated"); 
LocalBroadcastManager.getInstance(context.sendBroadcast(intent)); 

Тогда просто поймать Загвоздка сообщение, используя следующий код в вашей деятельности, и скажите вашему ListAdapter обновить ...

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
      myListAdapter.notifyDataSetChanged(); 
      } 
     }; 

@Override 
public void onResume(){ 
    super.onResume(); 
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("ListViewDataUpdated")); 
    myListAdapter.notifyDataSetChanged();//in case our data was updated while this activity was paused 
} 


@Override 
protected void onPause() { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    super.onPause(); 
} 

Кредит: адаптировано из Vogella

Смежные вопросы