从 IntentService 访问 Recyclerview 中的 TextView 和 Progressbar

Posted

技术标签:

【中文标题】从 IntentService 访问 Recyclerview 中的 TextView 和 Progressbar【英文标题】:Access TextView and Progressbar in Recyclerview from IntentService 【发布时间】:2017-05-08 23:31:24 【问题描述】:

我有一个 recyclerview,它有一个 TextView (progresstxt) 和一个 Progressbar (downloadprogress) 作为膨胀项目的一部分。

我需要知道如何从 IntentService 访问 SimpleAdapter 中的 TextView 和 Progressbar,以便更新它们的值?

我正在尝试使用 BroadcastReceiver 来实现这一点,但它不起作用,TextView 和 Progressbar 没有更新。

提前谢谢你。

我通过 onBindViewHolder 访问 TextView 和 Progressbar。

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) 完成了几个文件操作,我想从这个 IntentService 访问/更新 TextView 和 Progressbar。

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);
..
  

【问题讨论】:

查看此链接:***.com/questions/12498919/… 在接收器中取消注册您的广播并从 bindViewHolder mContext.unregisterReceiver(myBroadcastReceiver); mContext.unregisterReceiver(myBroadcastReceiver_Update); 中删除此行 感谢 Rajesh 但这并没有改变任何东西。 【参考方案1】:

代码有几个问题。您不应在 onBindViewHolder 方法中创建新的 Receiver。 应该有一个接收器来更新适配器使用的项目列表并在适配器上调用 notifyDataSetChanged。

希望对你有帮助

【讨论】:

这可以在没有广播接收器的情况下完成吗?我只需要访问 TextView 和 Progressbar,但我的问题是它们在视图中。 广播接收器是完成此任务的最简单方法。 TextView 和进度条最终由底层数据填充。因此,最好更改底层数据,而不是获取对 textview 和进度条的引用并更改值

以上是关于从 IntentService 访问 Recyclerview 中的 TextView 和 Progressbar的主要内容,如果未能解决你的问题,请参考以下文章

从 IntentService 调用 AsyncTask 的问题

IntentService的使用

从 IntentService 迁移到 Android O 的 JobIntentService

如何从 WakefulBroadcastReceiver 启动 IntentService

如何从 IntentService 创建吐司?它卡在屏幕上

在android中使用IntentService从服务器下载文件