я сделал приложение, используя 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;
}
}
если у вас есть какое-либо решение, пожалуйста, мне нужна ваша помощь. заранее спасибо.
Я не совсем понял требование, но вижу, что вы создаете уведомления в цикле for, который повторяется в течение времени adapter.getCount. Возможно, вы захотите переместить его за пределы цикла for.
что, если я использую result.items.data.size() вместо adapter.getCount() в цикле for?
Будет ли это иметь значение? Нет. Если вам нужно создать одно уведомление о доступности новых данных, вы можете просто сравнить недавно полученные данные, т. е. модифицированные данные API, с данными адаптера, используя идентификатор или какой-либо другой атрибут.
@LeyoussiLauriel, пожалуйста, присоединяйтесь к комнате, я смогу помочь вам лучше chat.stackoverflow.com/rooms/249822/…
Спасибо. я получаю комнату.
Я не могу попасть в чат из-за проблем с репутацией.
Упс. Можем ли мы попасть на встречу с Google? Пожалуйста, назначьте встречу до 21:00 по восточному поясному времени. Буду рад помочь :) Идентификатор электронной почты есть в моем профиле stackoverflow.com/users/2070800/hardik9850?tab=profile
Да, мы можем попасть на встречу с Google. [email protected]. я отправил тебе письмо
Спасибо @hardik9580. Вы нашли решения, еще раз спасибо.
Рад, что смог быть полезен :)
я думаю, что мне нужно подсчитать размер результатов с сервера, даже если он не отображается в списке, например, result.items.data.size() или result.items.data.count ?????. то если результаты идут ++, то выводится уведомление. Ребята, что вы думаете об использовании цикла (для.....)?