У меня есть RecyclerView, на котором отображаются сообщения типа Twitter. У каждого элемента списка есть сердечко, которое вы можете нажать, чтобы поставить отметку «Нравится».

Это работает так, что щелчок по значку сердца запускает IntentService, который вызывает API. Затем API возвращает код состояния (например, liked_successfully).

Моя проблема в том, что я хочу отключить этот маленький значок сердечка во время вызова API. Я могу отключить его, когда пользователь нажимает на него, настроив его в Adapter, но снова включить его - это то, что я не знаю, как это сделать.

Мой IntentService может транслировать результат всем зарегистрированным BroadcastReceivers. Я надеялся, что мой адаптер каким-то образом сможет это прослушать и снова включить значок сердца. Но я не думаю, что так можно регистрировать приемники ...

Есть ли способ решить мою проблему?

РЕДАКТИРОВАТЬ: Благодаря помощи ответа 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));
    }
}
-1
Micro 21 Фев 2016 в 07:12

2 ответа

Лучший ответ

Вместо использования широковещательных приемников используйте ResultReceiver, чтобы вы могли получить обратный вызов после выполнения вашего запроса. для реализации проверьте эту ссылку. создайте метод в своем классе адаптера, который будет вызываться при выполнении сетевого вызова. Теперь из активности вы можете вызвать тот же метод в своем адаптере после получения обратного вызова.

РЕДАКТИРОВАТЬ: вы можете использовать это так

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

При создании адаптера сделайте объект переменной уровня класса, поэтому onReceive () из resultReceiver вы можете называть его как

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
}
2
Community 23 Май 2017 в 11:50

Вы можете использовать библиотеку издателя / подписчика , например EventBus для достижения такой функциональности. Просто вы можете следовать этому руководству за то, что разобрались в этом.

0
Farhad Faghihi 21 Фев 2016 в 04:43