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 库来掌握它。
我有一个 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 库来掌握它。