Доступ к TextView и Progressbar в Recyclerview из IntentService

У меня есть просмотрщик, который имеет TextView (progresstxt) и Progressbar (downloadprogress) как часть надутых элементов.

Мне нужно знать, как я могу получить доступ к TextView и Progressbar в SimpleAdapter из IntentService, чтобы я мог обновить их значения?

Я пытаюсь добиться этого с BroadcastReceiver, но он не работает, TextView и Progressbar не обновляются.

Заранее спасибо.

Я получаю доступ к TextView и Progressbar через onBindViewHolder.

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder> implements FollowRedirectsCallback {

private final Context mContext;
private String recievedStr;
private int receivedProg;

private MyBroadcastReceiver myBroadcastReceiver;
private MyBroadcastReceiver_Update myBroadcastReceiver_Update;

public static class SimpleViewHolder extends RecyclerView.ViewHolder {
        public final TextView title, progresstxt;
        public ProgressBar downloadprogress;

        public SimpleViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.simple_text);
            progresstxt = (TextView) view.findViewById(R.id.progress_text);
            downloadprogress = (ProgressBar) view.findViewById(R.id.progressdownload);
        }
    ...
public class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            recievedStr = intent.getStringExtra(MoService.EXTRA_KEY_UPDATE);
            //progresstxt.setText(result); ?
            //how to access the TextView in onBindViewHolder?
        }
    }

public class MyBroadcastReceiver_Update extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        receivedProg = intent.getIntExtra(MoService.EXTRA_KEY_UPDATE_PROGRESS, 0);
        //downloadprogress.setProgress(update); ?
        //how to access the Progressbar in onBindViewHolder?

    }
}

...

@Override
    public void onBindViewHolder(final SimpleViewHolder holder, final int position) {
      //
        myBroadcastReceiver = new MyBroadcastReceiver();
        myBroadcastReceiver_Update = new MyBroadcastReceiver_Update();

        //register BroadcastReceiver
        IntentFilter intentFilter = new IntentFilter(MoService.ACTION_MyIntentService);
        intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
        mContext.registerReceiver(myBroadcastReceiver, intentFilter);

        IntentFilter intentFilter_update = new IntentFilter(MoService.ACTION_MyUpdate);
        intentFilter_update.addCategory(Intent.CATEGORY_DEFAULT);
        mContext.registerReceiver(myBroadcastReceiver_Update, intentFilter_update);

      //
        holder.progresstxt.setText(recievedStr);
        holder.downloadprogress.setProgress(receivedProg);
        holder.progresstxt.setVisibility(View.VISIBLE);
        holder.downloadprogress.setVisibility(View.VISIBLE);

      //
    }

    mContext.unregisterReceiver(myBroadcastReceiver);
    mContext.unregisterReceiver(myBroadcastReceiver_Update);
}

Через IntentService (MoService) выполняется несколько файловых операций, и я хочу получить доступ / обновить TextView и Progressbar из этого IntentService.

public class MoService extends IntentService {

public static final String ACTION_MyIntentService = "com.sample.RESPONSE";
    public static final String ACTION_MyUpdate = "com.sample.UPDATE";
    public static final String EXTRA_KEY_UPDATE = "EXTRA_UPDATE";
    public static final String EXTRA_KEY_UPDATE_PROGRESS = "EXTRA_UPDATE_PROGRESS";
    String message;
    int mProgress;
..
public MoService() {
        super("MyService");
    }

    @Override
    public void onCreate() {
        context = this;
        super.onCreate();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
    //
        Intent intentUpdate = new Intent();
        intentUpdate.setAction(ACTION_MyUpdate);
        intentUpdate.addCategory(Intent.CATEGORY_DEFAULT);
        intentUpdate.putExtra(EXTRA_KEY_UPDATE, message);
        sendBroadcast(intentUpdate);
    //
    }

class MyDownloadDownloadStatusListener implements DownloadStatusListener {
        @Override
        public void onDownloadComplete(DownloadRequest request) {
           message = "Status: completed...";
           mProgress = 0;
           progresstxt.setVisibility(View.GONE);
           downloadprogress.setVisibility(View.GONE);
..
  }
}

1 ответ

Есть несколько проблем с кодом. Вы не должны создавать новый Receiver в вашем методе onBindViewHolder. Должен быть один получатель, который обновляет список элементов, используемый вашим адаптером, и вызывает notifyDataSetChanged для адаптера.

Надеюсь, поможет

Другие вопросы по тегам