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を呼び出します。それはトリックを行うだろう。

関連する問題