Enable/Disable ImageView inside RecyclerView 基于网络调用结果

Enable/Disable ImageView inside RecyclerView based on network call result

我有一个 RecyclerView 可以像 post 一样显示推特。每个列表项都有一个小心脏可以按到"Like" post。

它的工作方式是单击心形图标会启动一个 IntentService,它会调用 API。 API 然后是 return 状态代码(例如 liked_successfully)。

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

我的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 return(通过广播或其他方式)adapterPosition 到您的 activity,在那里您可以引用该行并重新启用 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));
    }
}

不要使用广播接收器,而是使用 ResultReceiver,这样您就可以在请求完成后获得回调。为了实现检查这个 link。在您的适配器 class 中创建一个方法,以便在网络调用完成时调用。现在从 activity 开始,您可以在收到回调后在适配器中调用相同的方法。

编辑:你可以这样使用它

public class RandomAdapter extends BaseAdapter{
    public void updateAdapter(String <Some value>){
        // Do whatever you want here
    }
}

在创建adapter时,将object做成class级变量,所以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
}

您可以使用像 EventBus for achieving such functionality. Simply you can follow this tutorial 这样的 publisher/subscriber 库来掌握它。