我有一个IntentService
,显示Twitter的帖子。每个列表项都有一点心脏,你可以按“赞”帖子。
它的工作方式是单击心形图标会启动liked_successfully
,从而进行API调用。然后,API会返回状态代码(例如Adapter
)。
我的问题是我想在进行API调用时禁用那个小心脏图标。我可以在用户点击它时通过在IntentService
中设置它来禁用它,但是再次启用它是我不知道该怎么做。
我的BroadcastReceivers
可以将结果广播到所有已注册的ankit aggarwal
。我希望我的适配器能以某种方式听取它并再一次启用心脏图标。但我认为你不能注册那样的接收器......
有没有办法解决我的问题?
修改
感谢BroadcastReceiver
回答的帮助,我能够解决我的问题。这是我做的(请注意,我选择使用ResultReceiver
,但您可以使用ankit
作为建议的adapterPosition
以同样的方式执行此操作:
第1步:将onClick()
传递到适配器中public ViewHolder(View view) {
super(view);
// Get references to our views
heartImageView = (ImageView) view.findViewById(R.id.heartImageView);
heartImageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// Get adapter position
int adapterPosition = getAdapterPosition();
mCursor.moveToPosition(adapterPosition);
// Disable your ImageView
heartImageView.setClickable(false);
// Start your IntentService, passing in the adapterPosition as an extra
//...
});
}
方法内的服务:
adapterPosition
第2步:让您的IntentService返回(通过广播或其他方式)ImageView
到您的活动,在那里您获得对该行的引用并重新启用public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
int adapterPosition = extras.getInt(MyService.ADAPTER_POSITION);
// Re-enable the clicking of the heartImageView for that specific row in RecyclerView
RecyclerView.ViewHolder holder =
mRecyclerView.findViewHolderForAdapterPosition(adapterPosition);
// Get the view from the ViewHolder
View view = holder.itemView;
ImageView heartImageView = (ImageView) view.findViewById(R.id.heartImageView);
// Re-enable the ImageView
heartImageView.setClickable(true);
Log.d("MicroR", "heartImageView enabled again for position: " + String.valueOf(adapterPosition));
}
}
。
{{1}}
答案 0 :(得分:2)
使用ResultReceiver而不是使用广播接收器,这样您就可以在请求完成后收到回调。实施检查link。在网络调用完成时,在您的适配器类中创建一个方法。现在,从活动开始,您可以在收到回调后在适配器中调用相同的方法。
编辑:您可以像这样使用
public class RandomAdapter extends BaseAdapter{
public void updateAdapter(String <Some value>){
// Do whatever you want here
}
}
在创建适配器时,将对象作为类级别变量,使得resultReceiver的onReceive(),你可以像
一样调用它mAdapter.updateAdapter(<some value>);
如果要编辑行,则必须获取行项的位置。
ListView list = getListView();
int firstVisibleElement = postListView.getFirstVisiblePosition();
int lastVisibleElement = postListView.getLastVisiblePosition();
if (position >= firstVisibleElement && position <= lastVisibleElement) {
View view = postListView.getChildAt(position - firstVisibleElement);
// now get your like imageview from view and do whatever you want to do with it
}
答案 1 :(得分:0)
您可以使用 EventBus 等发布商/订阅者库来实现此类功能。只需按照this tutorial进行操作即可掌握。