Создать уведомление, когда listview получает новый элемент
Я создал приложение для получения данных из базы данных на веб-сайте и просмотра их в listview , я хочу, когда listview получает некоторые новые данные , чтобы создать уведомление, поэтому для этого я создаю метод обновления listview каждые x секунд, но он не работает, он просто создает уведомления повторно . чтобы узнать, получает ли listview новый элемент, я сравниваю старый размер listview с новым, если это то же самое, я ничего не делаю, иначе я создаю уведомление. Мой код :
public class NotificationFragment extends Fragment { Button loginButton; //List<DataModel> listItems; ArrayList<String> listItems=new ArrayList<String>(); List<DataModel> DataModelList; ListView listView; public static final String Colloge_section="MyPrefs"; public NotificationFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_notification, container, false); DataModelList = new ArrayList<>(); listView =(ListView)view.findViewById(R.id.listview1); TextView name = (TextView)view.findViewById(R.id.name); buadd(); new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { buadd(); } }, 0, 7000);//put here time 1000 milliseconds=1 second final SwipeRefreshLayout pullToRefresh = (SwipeRefreshLayout)view.findViewById(R.id.swipe_container); pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { DataModelList.clear(); buadd(); pullToRefresh.setRefreshing(false); } }); return view; } public void buadd(){ Thread runt=new Thread(){ public void run(){ CallNotservice cweb=new CallNotservice(); cweb.OpenNotifications();} }; runt.start(); try{ runt.join(); String [] lst1=(ContactResult.ArrayMessage).split("&"); MyListAdapter adapter = new MyListAdapter(getActivity(), R.layout.row, DataModelList); for (int i=lst1.length-1 ;i>=1;i--) { DataModelList.add(new DataModel(lst1[i])); } listView.setAdapter(adapter); } catch(Exception ex){ } notifyThis("تطبيق جامعة كرري", "هنالك اشعار جديد , اضغط هنا لفتح التطبيق"); } public void notifyThis(String title, String message) { SharedPreferences prfs = getActivity().getSharedPreferences("MyPrefs", MODE_PRIVATE); int Astatus = prfs.getInt("new_notify", 0); try { if (listView.getAdapter().getCount() != Astatus) { SharedPreferences.Editor editor = getActivity().getSharedPreferences(Colloge_section, MODE_PRIVATE).edit(); editor.putInt("new_notify", listView.getAdapter().getCount()); editor.apply(); } } catch (Exception e){ Toast.makeText(getContext(),"لاتوجد إشعارات جديده",Toast.LENGTH_LONG).show(); } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getContext()); mBuilder.setAutoCancel(true) .setDefaults(NotificationCompat.DEFAULT_ALL) .setTicker("{هنالك اشعار جديد في لوحة الاشعارات.}") .setContentTitle(title) .setContentText(message) .setSmallIcon(R.drawable.icon) .setContentInfo("تنبيه !"); Intent notificationIntent = new Intent(getContext(), KworldActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(contentIntent); NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(001, mBuilder.build()); } }
Что я уже пробовал:
используйте doInBackground вместо таймера
David Crow
Ваш подход не самый оптимальный и эффективный. Я предлагаю использовать CursorLoader
См . обсуждение здесь для того, как работает уведомление, чтобы вам не приходилось тратить циклы процессора на опрос хранилища данных.
В то время как у меня есть статья CP, которая демонстрирует это, плюс тонна других вещей, которые вам придется пропалывать, есть тонны других доступных, которые специфичны для CursorLoader
и как он уведомляет "автоматически."
Member 13366692
вы можете мне в этом помочь?