Android 基于网络调用结果启用/禁用RecyclerView内部的ImageView

Android 基于网络调用结果启用/禁用RecyclerView内部的ImageView,android,android-recyclerview,android-intentservice,android-broadcastreceiver,Android,Android Recyclerview,Android Intentservice,Android Broadcastreceiver,我有一个RecyclerView,显示类似twitter的帖子。每个列表项都有一颗小小的心,你可以按下它来“喜欢”这篇文章 它的工作方式是,单击心脏图标启动一个IntentService,从而进行API调用。然后,API返回一个状态代码(例如,liked\u成功) 我的问题是,我想在进行API调用时禁用这个小心脏图标。当用户点击它时,我可以通过在适配器中设置它来禁用它,但我不知道如何再次启用它 MyIntentService可以将结果广播给所有注册的BroadcastReceivers。我希望我

我有一个
RecyclerView
,显示类似twitter的帖子。每个列表项都有一颗小小的心,你可以按下它来“喜欢”这篇文章

它的工作方式是,单击心脏图标启动一个
IntentService
,从而进行API调用。然后,API返回一个状态代码(例如,
liked\u成功

我的问题是,我想在进行API调用时禁用这个小心脏图标。当用户点击它时,我可以通过在
适配器中设置它来禁用它,但我不知道如何再次启用它

My
IntentService
可以将结果广播给所有注册的
BroadcastReceivers
。我希望我的适配器能以某种方式监听,并再次启用心脏图标。但我不认为你可以像那样注册接收者

有什么办法解决我的问题吗

编辑: 多亏了ankit aggarwal的回答,我才得以解决我的问题。以下是我所做的(注意,我选择了使用
BroadcastReceiver
,尽管您可以按照
ankit
建议的方法使用
ResultReceiver
):

步骤1:在适配器中的
onClick()
方法中将
adapterPosition
传递给您的服务:

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
                    //...
            });
       }
步骤2:让您的IntentService(通过广播或其他方式)将
适配器位置
返回到您的活动中,在那里您可以获得对该行的引用,并重新启用
图像视图

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

不要使用广播接收器,而是使用ResultReceiver,这样您可以在请求完成后获得回调。对于实现,请检查此项。在适配器类中创建一个方法,以便在完成网络调用时调用。现在,从活动中,您可以在收到回调后在适配器中调用相同的方法

编辑:您可以这样使用它

public class RandomAdapter extends BaseAdapter{
    public void updateAdapter(String <Some value>){
        // Do whatever you want here
    }
}
公共类RandomAdapter扩展了BaseAdapter{
公共void updateAdapter(字符串){
//在这里你想干什么就干什么
}
}
创建适配器时,将对象设为resultReceiver的类级变量so onReceive(),您可以像这样调用它

mAdapter.updateAdapter(<some value>);
mAdapter.updatedapter();
如果要编辑行,必须获取行项目的位置

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
}
ListView list=getListView();
int firstVisibleElement=postListView.getFirstVisiblePosition();
int lastVisibleElement=postListView.getLastVisiblePosition();

如果(position>=firstVisibleElement&&position您可以使用发布者/订阅者库,如,来实现此类功能。您只需遵循即可掌握该功能。

也许我当时应该问您的是,如何在适配器类中创建可由Activity/Fra调用的方法通过ResultReceiver接收结果的分段?感谢您的更新。但这让我想到另一个问题:如何在
mAdapter.updatedapter()中的特定行中启用/禁用ImageView?我可以将光标ID传递到
updatedapter()
,但之后..?不要传递光标id。只传递项目位置。检查更新的解决方案。我使用的是
RecyclerView
。因此我可以将项目位置传递回适配器。但是一旦进入适配器,我不确定如何处理该项目位置-这就是如何根据该项目位置获取图像视图的方法适配器中的视图更新…?我建议您不要在适配器中执行此视图更新部分,只需在活动中执行它。您可以通过view view=postListView.getChildAt(position-firstVisibleElement);ImageView img=view.findViewById(R.id.your_drawable_id);img.setImageResource()进行更改;此处变量位置表示要编辑的列表项的位置