現在のステータスバー通知のリストを表示するrecyclerView
を作成しようとしていました。私はすべての通知を格納するためにSQLiteのDBを使用していますList
notifyDataSetChanged()がカスタムRecyclerViewアダプタで動作しない
NotificationItemInformation
の
public class NotificationItemInformation
{
int iconId,noitId;
String packageName;
Drawable notiIcon;
}
を取るカスタムアダプタ(NotiRecyclerAdapter
)を作成しました。 NotificationListenerService
は、通知がポストされたり削除されたりするたびに、DBから書き込みおよび削除を行います。
私はNotificationItemInformation
のList
にDBの内容を読み取るために(myDBHelperの内部にある)
public List<NotificationItemInformation> ReadNotilist (Context context);
と呼ばれる方法を使用するには、(私の主な活動で、地球公共および静的である)data
と呼ばれます。 私はadapter
(私のメインアクティビティではグローバル、パブリック、スタティック)を使用してdata
を取得し、onCreate
メソッド内のRecyclerView
に私のMainActivity
を設定します。
これまでのところすべてうまくいきました。現在StatusBar
通知が入力されたRecyclerView
が表示されます。
問題は、アクティビティを再開するまでリストが更新されない(新しい通知があった場合)ということです。私は私のNotificationListenerService
の(DBに追加した後)onNotificationPosted
内... ...呼び出し
MainActivity.data.clear();
MainActivity.data = dbh.ReadNotilist(this); // dbh is DBhelper object
MainActivity.adapter.notifyDataSetChanged();
を試してみました。しかし、私は活動を再開するまでまだRecyclerView
は更新されていません。
あなたが見たい場合はここに私のMainActivity
です。ここで
public class MainActivity extends AppCompatActivity
{
SQLiteDatabase db;
DBHelper dbh;
RecyclerView notificationIconRecyclerView;
public static NotiRecyclerAdapter adapter;
public static List<NotificationItemInformation> data = Collections.EMPTY_LIST;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbh = new DBHelper(this);
db = dbh.getDb();
notificationIconRecyclerView = (RecyclerView) findViewById(R.id.notificationIconRecyclerView);
data = dbh.ReadNotilist(this);
adapter = new NotiRecyclerAdapter(this,data);
notificationIconRecyclerView.setAdapter(adapter);
notificationIconRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true));
}
}
は、データオブジェクトへの参照をリセットしないでくださいRecyclerView
public class NotiRecyclerAdapter extends RecyclerView.Adapter<NotiRecyclerAdapter.MyViewHolder>
{
private LayoutInflater inflater;
List<NotificationItemInformation> data = Collections.emptyList();
NotiRecyclerAdapter(Context context, List<NotificationItemInformation> data)
{
inflater = LayoutInflater.from(context);
this.data = data;
}
@Override
public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer)
{
super.registerAdapterDataObserver(observer);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = inflater.inflate(R.layout.custom_recyclerview_item,parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
{
NotificationItemInformation current = data.get(position);
holder.recyclerItemIcon.setImageDrawable(current.notiIcon);
}
@Override
public int getItemCount()
{
return data.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder
{
ImageView recyclerItemIcon;
public MyViewHolder(View itemView)
{
super(itemView);
recyclerItemIcon = itemView.findViewById(R.id.notiRecyclerItemIcon);
}
}
}
あなたのアダプターのコンストラクターを見るのが好きです。データリストのコピーを作成していると思われます。実際には、アダプタコード全体を見ると便利です。 –
@ BenP。助けてくれてありがとう、私は今質問の全体のアダプタコードを追加しました。 –