从 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/… 在接收器中取消注册您的广播并从 bindViewHoldermContext.unregisterReceiver(myBroadcastReceiver); mContext.unregisterReceiver(myBroadcastReceiver_Update);
中删除此行
感谢 Rajesh 但这并没有改变任何东西。
【参考方案1】:
代码有几个问题。您不应在 onBindViewHolder 方法中创建新的 Receiver。 应该有一个接收器来更新适配器使用的项目列表并在适配器上调用 notifyDataSetChanged。
希望对你有帮助
【讨论】:
这可以在没有广播接收器的情况下完成吗?我只需要访问 TextView 和 Progressbar,但我的问题是它们在视图中。 广播接收器是完成此任务的最简单方法。 TextView 和进度条最终由底层数据填充。因此,最好更改底层数据,而不是获取对 textview 和进度条的引用并更改值以上是关于从 IntentService 访问 Recyclerview 中的 TextView 和 Progressbar的主要内容,如果未能解决你的问题,请参考以下文章
从 IntentService 调用 AsyncTask 的问题
从 IntentService 迁移到 Android O 的 JobIntentService