Ответ 1
Немного поздно, но я нашел способ заставить его работать.
Мой recyclerview содержит большое число зрителей, и только один из зрителей имеет индикатор выполнения. У меня есть база данных sqlite, в которой я поддерживаю идентификаторы, которые я использую для синхронизации между моей службой и активностью (для определения того, какие виды в recyclerview необходимо обновить).
В зависимости от вашей реализации вам нужно будет найти способ определить, какое событие трансляции соответствует тому элементу адаптера. Я дал упрощенную версию того, что я сделал ниже.
Модель для панели выполнения:
class ProgressModel{
String progressId;
int progress = 0;
}
public int getProgress(){
return progress;
}
ViewHolder:
public class ProgressViewHolder extends RecyclerView.ViewHolder {
private ProgressBar mProgressBar;
public ProgressViewHolder(View itemView) {
mProgressBar = (ProgressBar) itemView.findViewById(R.id.mProgressBar);
}
public ProgressBar getProgressBar() {
return mProgressBar;
}
}
В адаптере recycliewiew,
@Override
public void onBindViewHolder(ProgressViewHolder holder, int position) {
ProgressModel item = mData.get(position);
int progress = item.getProgress();
if (progress > 0) {
ProgressBar downloadProgress = holder.getProgressBar();
if (downloadProgress.isIndeterminate()) {
downloadProgress.setIndeterminate(false);
}
downloadProgress.setProgress(progress);
}
}
public void refresh(position, ProgressModel item){
mData.set(position, item);
notifyItemChanged(position);
}
В Управлении, которое реализует заполнение представления, создайте статический экземпляр самого себя и передайте его в BroadcastReceiver. Мне потребовалось некоторое время, чтобы понять, что требуется статический экземпляр, иначе представление не будет изменено, хотя я вызываю notifyItemchanged().
public class MainActivity extends Activity{
private static MainActivity instance;
private MyReceiver mReceiver;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
mReceiver = new MyReceiver(instance);
//TODO: Initialize adapter with data and set to recyclerview
}
public void update(Intent intent){
ProgressModel model = new ProgressModel ();
//TODO: set progress detail from intent to model and get position from progressId
instance.mAdapter.refresh(position,model);
}
private static class MyReceiver extends BroadcastReceiver {
MainActivity activity;
public DownloadReceiver(MainActivity activity) {
this.activity = activity;
}
@Override
public void onReceive(Context context, Intent intent) {
//pass intent with progress details to activity
activity.update(intent);
}
}
}
Надеюсь, что это поможет.