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。這會做到這一點。