У меня есть RecyclerView
, который отображает сообщения в твиттере. У каждого элемента списка есть маленькое сердечко, которое вы можете нажать, чтобы поставить «Нравится» сообщению.
Это работает следующим образом: щелчок по значку сердца запускает IntentService
, который выполняет вызов API. Затем API возвращает код состояния (например, liked_successfully
).
Моя проблема в том, что я хочу отключить этот маленький значок сердца во время выполнения вызова API. Я могу отключить его, когда пользователь нажимает на него, настроив это в Adapter
, но включить его снова — это то, что я не знаю, как это сделать.
Мой IntentService
может транслировать результат всем зарегистрированным BroadcastReceivers
. Я надеялся, что мой адаптер каким-то образом подслушает это и снова активирует значок сердца. Но я не думаю, что вы можете регистрировать такие приемники...
Есть ли способ решить мою проблему?
EDIT: Благодаря помощи ответа ankit aggarwal
я смог решить свою проблему. Вот что я сделал (обратите внимание, я выбрал BroadcastReceiver
, хотя вы могли бы сделать то же самое с ResultReceiver
, как было предложено ankit
):
Шаг 1: Передайте adapterPosition
вашей службе внутри метода 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
//...
});
}
Шаг 2: Пусть ваш IntentService вернет (через широковещательную рассылку или иным образом) этот adapterPosition
в вашу активность, где вы получите ссылку на эту строку и снова включите функцию 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));
}
}