Как сделать уведомление OnItemchange при появлении нового элемента в списке

я сделал приложение, используя java и retrofit2 для извлечения данных с сервера. Мой список может отображать только 30 элементов. когда новый элемент отображается в списке, последний автоматически удаляется, а новый отображается в этом списке. моя модель события:

public class Event {
    public int id, user_id, device_id, position_id, alert_id;
    // geofence_id
    public String message;
    public String address;
    public float altitude;
    // course
    public float latitude, longitude;
    // power
    public float speed;
    public String time;
    // deleted

    public String device_name, geofence_name;
}

моя активность на мероприятии:

public class EventsActivity extends AppCompatActivity
{
    @Bind(R.id.back) View back;
    @Bind(R.id.list) ListView list;
    @Bind(R.id.clearAllEvents) View clearAllEvents;
    @Bind(R.id.content_layout) View content_layout;
    @Bind(R.id.loading_layout) View loading_layout;
    @Bind(R.id.nodata_layout) View nodata_layout;
    @Bind(R.id.search) View search;
    String searchtext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_events);
        ButterKnife.bind(this);

        final String api_key = (String) DataSaver.getInstance(EventsActivity.this).load("api_key");
        final EventsAdapter adapter = new EventsAdapter(this);
        list.setAdapter(adapter);

        loading_layout.setVisibility(View.VISIBLE);
        API.getApiInterface(this).getEvents(api_key, getResources().getString(R.string.lang), 0, new Callback<ApiInterface.GetEventsResult>() {
            @Override
            public void success(ApiInterface.GetEventsResult result, Response response)
            {
                adapter.setArray(result.items.data);

                loading_layout.setVisibility(View.GONE);
                if (result.items.data.size() != 0)
                    content_layout.setVisibility(View.VISIBLE);
                else
                    nodata_layout.setVisibility(View.VISIBLE);
            }

            @Override
            public void failure(RetrofitError retrofitError) {
                Toast.makeText(EventsActivity.this, R.string.errorHappened, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

мой EventAdapter:

public class EventsAdapter extends AwesomeAdapter<Event> {
    public EventsAdapter(Context context) {
        super(context);
    }

    ArrayList<Event> original;
    @Override
    public void setArray(ArrayList<Event> array) {
        super.setArray(array);
        if (original == null)
            original = array;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
            convertView = getLayoutInflater().inflate(R.layout.adapter_events, null);

        Event item = getItem(position);
        TextView device_name = (TextView) convertView.findViewById(R.id.device_name);
        device_name.setText(item.device_name);
        TextView date = (TextView) convertView.findViewById(R.id.date);
        date.setText(item.time);
        TextView message = (TextView) convertView.findViewById(R.id.message);
        message.setText(item.message);
        TextView geofence_name = (TextView) convertView.findViewById(R.id.geofence_name);
        geofence_name.setText(item.geofence_name);

        return convertView;
    }

}

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

API.getApiInterface(this).getEvents(api_key, getResources().getString(R.string.lang), 0, new Callback<ApiInterface.GetEventsResult>() {
            @SuppressLint("SetTextI18n")
            @Override
            public void success(ApiInterface.GetEventsResult result, Response response)
            {
                adapter.setArray(result.items.data);
                if (result.items.data.size() != 0) {
                    layout_evennements.setVisibility(View.VISIBLE);
                    text_count.setText("Evennements recu:" + listview_evennements.getAdapter().getCount());
                    //to upload all list one to one together.
                    for(int i = result.items.data.size(); i <= result.items.data.size(); i++) {
                                int notificationId = new Random().nextInt(100);
                                String channelId = "notification_channel_1";
                                 Event item = new Event();
                                NotificationManager notificationManager =  (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                               if (i > result.items.data.size()){
                                   Intent intent = new Intent(MapActivity.this, EventActivity.class);
                                   intent.putExtra("event", new Gson().toJson(listview_evennements.getItemAtPosition(0)));
                                   startActivity(intent);
                                   getIntent().addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                   @SuppressLint("UnspecifiedImmutableFlag") PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
                                           0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
                                   NotificationCompat.Builder builder = new NotificationCompat.Builder(
                                           getApplicationContext(), channelId
                                   );

                                   builder.setSmallIcon(R.drawable.ic_notification_original);
                                   builder.setDefaults(NotificationCompat.DEFAULT_ALL);
                                   builder.setContentTitle("GPSTrackr");
                                   builder.setContentText("Evenement" + item.device_name);
                                   builder.setContentIntent(pendingIntent);
                                   builder.setAutoCancel(true);
                                   builder.setPriority(NotificationCompat.PRIORITY_MAX);
                                   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                                       if (notificationManager != null && notificationManager.getNotificationChannel(channelId) ==null){
                                           NotificationChannel notificationChannel = new NotificationChannel(
                                                   channelId, "Notification channel 1", NotificationManager.IMPORTANCE_HIGH
                                           );
                                           notificationChannel.setDescription("Notificatoins evenements");
                                           notificationChannel.enableLights(true);
                                           notificationChannel.enableVibration(true);
                                           notificationManager.createNotificationChannel(notificationChannel);
                                       }
                                   }
                                   Notification notification = builder.build();
                                   if (notificationManager != null) {
                                       notificationManager.notify(notificationId, notification);
                                   }
                               }else if (i == result.items.data.size()){
                                   MotionToast.Companion.darkColorToast(MapActivity.this, "Aucune Notification",
                                           MotionToast.TOAST_INFO,
                                           MotionToast.GRAVITY_CENTER,
                                           MotionToast.SHORT_DURATION,
                                           ResourcesCompat.getFont(MapActivity.this, R.font.helveticacompressed5871d14b6903a));
                               }
                    }
                }else {
                    rien_a_voir.setVisibility(View.VISIBLE);
                }
            }
            @Override
            public void failure(RetrofitError retrofitError) {
                rien_a_voir.setVisibility(View.VISIBLE);
                layout_evennements.setVisibility(View.GONE);
            }
        });

мой интерфейс API:

@GET("/get_events")
    void getEvents(@Query("user_api_hash") String user_api_hash, @Query("lang") String lang, @Query("page") int page, Callback<GetEventsResult> cb);

    public static class GetEventsResult
    {
        public int status;
        public GetEventsResultItems items;

        public class GetEventsResultItems
        {
            public int total, per_page, current_page, last_page, from, to;
            public ArrayList<Event> data;
        }

    }

если у вас есть какое-либо решение, пожалуйста, мне нужна ваша помощь. заранее спасибо.

я думаю, что мне нужно подсчитать размер результатов с сервера, даже если он не отображается в списке, например, result.items.data.size() или result.items.data.count ?????. то если результаты идут ++, то выводится уведомление. Ребята, что вы думаете об использовании цикла (для.....)?

Leyoussi Lauriel 22.11.2022 11:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не совсем понял требование, но вижу, что вы создаете уведомления в цикле for, который повторяется в течение времени adapter.getCount. Возможно, вы захотите переместить его за пределы цикла for.

что, если я использую result.items.data.size() вместо adapter.getCount() в цикле for?

Leyoussi Lauriel 22.11.2022 13:22

Будет ли это иметь значение? Нет. Если вам нужно создать одно уведомление о доступности новых данных, вы можете просто сравнить недавно полученные данные, т. е. модифицированные данные API, с данными адаптера, используя идентификатор или какой-либо другой атрибут.

hardik9850 23.11.2022 07:01

@LeyoussiLauriel, пожалуйста, присоединяйтесь к комнате, я смогу помочь вам лучше chat.stackoverflow.com/rooms/249822/…

hardik9850 23.11.2022 07:05

Спасибо. я получаю комнату.

Leyoussi Lauriel 23.11.2022 09:30

Я не могу попасть в чат из-за проблем с репутацией.

Leyoussi Lauriel 23.11.2022 10:06

Упс. Можем ли мы попасть на встречу с Google? Пожалуйста, назначьте встречу до 21:00 по восточному поясному времени. Буду рад помочь :) Идентификатор электронной почты есть в моем профиле stackoverflow.com/users/2070800/hardik9850?tab=profile

hardik9850 23.11.2022 10:51

Да, мы можем попасть на встречу с Google. [email protected]. я отправил тебе письмо

Leyoussi Lauriel 23.11.2022 11:06

Спасибо @hardik9580. Вы нашли решения, еще раз спасибо.

Leyoussi Lauriel 25.11.2022 13:30

Рад, что смог быть полезен :)

hardik9850 27.11.2022 07:52

Другие вопросы по теме