0

Я использую alarmmanager, и код выглядит хорошо, не выдавая никаких ошибок, но мой макет не обновляется правильно, что здесь происходит неправильно? Я пробовал все комбинации с диспетчером аварийных сообщений, но мой список не обновлялся автоматически.Recyleview не обновляет адаптер или макет автоматически

Вот мой главный:

public class MainActivity extends AppCompatActivity implements UpdateResultReceiver.Receiver { 
private static final String TAG = "MainActivity"; 
Data mData; 
RecyclerView recyclerView; 
NotificationManager manager; 
static int x = 0; 
RecyclerAdapter adapter; 
private boolean isInited = false; 

ArrayList<String> liste; 
ArrayList<String> liste2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
    manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

    init(); 
} 

private void fillLists() { 
    new AsyncCaller().execute(); 
} 

private void init() { 
    fillLists(); 
    scheduleUpdater(); 
} 

private class AsyncCaller extends AsyncTask<Void, Void, Data> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Data doInBackground(Void... params) { 
     try { 
      mData = new Data(); 
     } catch (Exception e) { 
      Log.e(TAG, "doInBackground: ", e); 
     } 
     return mData; 
    } 

    @Override 
    protected void onPostExecute(Data data) { 
     super.onPostExecute(data); 
     if (mData == null) { 
      Toast.makeText(MainActivity.this, "Hata oluştu", Toast.LENGTH_SHORT).show(); 
      return; 
     } 
     liste = data.getList(); 
     liste2 = data.getList2(); 
     int s = data.ListSize(); 

     if (!isInited && liste != null && liste.size() > 0) { 
      adapter = new RecyclerAdapter(liste, liste2, MainActivity.this); 
      recyclerView.setAdapter(adapter); 
      recyclerView.setHasFixedSize(true); 
      recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 
      isInited = true; 
     } 
     if (isInited) { 
      adapter.notifyDataSetChanged(); 

      int a = adapter.getItemCount(); 
      if (a != x) { 
       generateNotification(MainActivity.this, "Listede Degisim Var"); 

      } 
      x = a; 
     } 
    } 
} 

private void generateNotification(Context context, String message) { 
    int notificationId = 001; 
    Intent viewIntent = new Intent(context, MainActivity.class); 

    PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); 

    NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.dikat).setContentTitle("Bildirim").setContentText(message) 
      .setContentIntent(viewPendingIntent).setAutoCancel(true) 
      .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); 

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 

    notificationManager.notify(notificationId, notificationBuilder.build()); 
} 

@Override 
public void onReceiveResult(int resultCode, Bundle resultData) { 
    fillLists(); 
} 

public void scheduleUpdater() { 
    try { 
     if (!isAlarmUp(this)) { 
      UpdateResultReceiver mReceiver = new UpdateResultReceiver(new Handler()); 
      mReceiver.setReceiver(this); 
        /* Setting the alarm here */ 
      Intent alarmIntent = new Intent(this, PatientListUpdaterReceiver.class); 
      alarmIntent.putExtra("receiver", mReceiver); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 

      AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
      manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System 
        .currentTimeMillis(), 10000, pendingIntent); 
     } 
    } catch (Exception e) { 
     Log.e("asdads", "schedule: " + e.getMessage(), e); 
    } 

} 

public void cancelUpdater(Context context) { 
    try { 
     if (isAlarmUp(context)) { 
      Intent intent = new Intent(context, PatientListUpdaterReceiver.class); 
      PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
      AlarmManager alarmManager = (AlarmManager) context 
        .getSystemService(Context.ALARM_SERVICE); 

      alarmManager.cancel(sender); 
     } 
    } catch (Exception e) { 
     Log.e("asdasd", "cancel: " + e.getMessage(), e); 
    } 
} 

private boolean isAlarmUp(Context context) { 
    return (PendingIntent 
      .getBroadcast(context, 0, new Intent(context, PatientListUpdaterReceiver.class), PendingIntent.FLAG_NO_CREATE) != null); 
} 
} 

Вот мой адаптер:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> { 

int sayi=0; 
ArrayList<String> liste ,liste2; 
static ArrayList<String> liste3 = new ArrayList<>() ; 

Context context; 
LayoutInflater inflater; 
public RecyclerAdapter(ArrayList<String> liste, ArrayList<String> liste2, Context context) { 
    this.context=context; 
    this.liste=liste; 
    this.liste2=liste2; 
    inflater=LayoutInflater.from(context); 
} 
@Override 
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v=inflater.inflate(R.layout.item_list, parent, false); 



    RecyclerViewHolder viewHolder=new RecyclerViewHolder(v); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(RecyclerViewHolder holder, int position) { 
    liste3.add("a"); 

    sayi = 0; 
    for (int j = 0; j < liste3.size(); j++) { 
     if (liste3.get(j).equals(liste.get(position))) { 
      sayi++; 
     } 
     if (sayi == 0) { 
      holder.imageView.setTag(holder); 
     } else { 
      holder.imageView.setImageResource(R.drawable.ic_checkin); 
     } 
     holder.tv1.setText(liste.get(position)); 
     holder.tv2.setText(liste2.get(position)); 
     holder.imageView.setOnClickListener(clickListener); 
    } 

} 


View.OnClickListener clickListener=new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 


     RecyclerViewHolder vholder = (RecyclerViewHolder) v.getTag(); 
     int position = vholder.getPosition(); 
     //Toast.makeText(context,"This is position "+position,Toast.LENGTH_LONG).show(); 
     vholder.imageView.setImageResource(R.drawable.ic_checkin); 
     liste3.add(liste.get(position)); 
    } 
}; 





@Override 
public int getItemCount() { 
    return liste.size(); 
} 




} 

Вот часть данных:

public class Data { 

String ip, db, un, passwords; 
Connection connect; 
PreparedStatement stmt; 
ResultSet rs; 


ArrayList<String> data = new ArrayList<>(); 
ArrayList<String> data2 = new ArrayList<>(); 
public Data(){ 
    ip = "X.X.X.X"; 
    un = "sa"; 
    passwords = "1"; 
    db = "ANKET"; 

    connect = CONN(un, passwords, db, ip); 
    String query = "SELECT Hasta_dosyano,Notlar FROM Hasta"; 



    try { 
     stmt = connect.prepareStatement(query); 
     rs = stmt.executeQuery(); 

     while (rs.next()) { 

       String id = rs.getString("Hasta_dosyano"); 
       String id2 = rs.getString("Hasta_dosyano"); 
       String full = id + " " + id2; 
       String time = rs.getString("Notlar"); 
       data.add(full); 
       data2.add(time); 


     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

} 

public ArrayList<String> getList() { 
    return data; 
} 
public ArrayList<String> getList2() { 
    return data2; 
} 
public int ListSize() { 
    return data.size(); 
} 

@SuppressLint("NewApi") 
private Connection CONN(String _user, String _pass, String _DB, 
         String _server) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    Connection conn = null; 
    String ConnURL = null; 
    try { 

     Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
     ConnURL = "jdbc:jtds:sqlserver://" + _server + ";" 
       + "databaseName=" + _DB + ";user=" + _user + ";password=" 
       + _pass + ";"; 
     conn = DriverManager.getConnection(ConnURL); 
    } catch (SQLException se) { 
     Log.e("ERRO", se.getMessage()); 
    } catch (ClassNotFoundException e) { 
     Log.e("ERRO", e.getMessage()); 
    } catch (Exception e) { 
     Log.e("ERRO", e.getMessage()); 
    } 
    return conn; 
} 
} 
+0

ли это решение? –

ответ

0

Проблема заключается в изменении ссылки на данные, так адаптер не понимает изменений! Давайте покажем вам пример:

List data=new ArrayList(); 
MyAdapter adapter=new MyAdapter(data); 

Позже, если вы хотите, чтобы адаптер получать уведомления об изменениях, вы должны использовать только ссылку, которую передается адаптер! Вы должны сделать data глобальной переменной (закрытой, общедоступной, независимо от того, что вам нравится), чтобы вы могли получить доступ к ней из других мест вашего кода. то вы просто изменяете данные в нем и добавляете или удаляете элементы, а затем вызываете notifydatasetchange. Это сделало бы трюк.