根据网络调用结果在RecyclerView中启用/禁用ImageView

时间:2016-02-21 04:12:14

标签: android android-recyclerview android-intentservice android-broadcastreceiver

我有一个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}}

2 个答案:

答案 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进行操作即可掌握。