0

현재 상태 표시 줄 알림 목록을 표시하는 recyclerView을 만들려고했습니다. 나는 모든 알림을 저장하기 위해 SQLite는 DB를 사용하여 오전 List사용자 RecyclerView 어댑터에서 notifyDataSetChanged()가 작동하지 않습니다.

public class NotificationItemInformation 
{ 
    int iconId,noitId; 
    String packageName; 
    Drawable notiIcon; 
} 

NotificationItemInformation의 소요 사용자 정의 어댑터 (NotiRecyclerAdapter를) 만들었습니다. NotificationListenerService은 알림이 게시되거나 제거 될 때마다 DB에서 쓰고 삭제합니다.

나는 (글로벌 공공 및 내 주요 활동에서 정적) data라고 NotificationItemInformationList에 DB의 내용을 읽고 (myDBHelper 내부)

public List<NotificationItemInformation> ReadNotilist (Context context); 

라는 방법을 사용합니다. 그 다음 adapter (내 주요 활동에 전역, 공개 및 정적 임)을 사용하여 data을 가져오고 메서드 내 RecyclerView에 내 MainActivity을 설정합니다.

지금까지 모든 것이 잘 작동합니다. 그리고 에 현재 StatusBar 알림이 표시되어 있습니다.

문제는 활동을 다시 시작할 때까지 목록이 업데이트되지 않는다는 것입니다 (새로운 알림이 오는 경우). 내 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); 
     } 
    } 

} 
+0

어댑터의 생성자를보고 싶습니다. 나는 당신이 데이터 목록이나 비슷한 것을 복사하고 있다고 의심합니다. 사실 전체 어댑터 코드가 유용 할 것입니다. –

+0

@BenP. 도움을 주셔서 감사합니다, 지금 질문에 전체 어댑터 코드를 추가했습니다. –

답변

0

내 사용자 정의 어댑터입니다. 대신이 같은 시도 :

MainActivity.data.clear(); 
MainActivity.data.addAll(dbh.ReadNotilist(this)); 
MainActivity.adapter.notifyDataSetChanged(); 
+0

감사합니다. . 이 문제가 해결되었습니다! –

0

어댑터의 생성자에서를, 당신은이 어댑터의 data 필드 생성자에 전달 된 List<NotificationItemInformation> 할당

this.data = data; 

물품. 어댑터는 다음과 같이 구성된다 :

adapter = new NotiRecyclerAdapter(this,data); 

이것은 당신의 MainActivity.data 필드와 adapter.data 필드가 모두 같은 목록에 언급하는 것을 의미한다.

는 나중에 쓰기 :

MainActivity.data.clear(); 
MainActivity.data = dbh.ReadNotilist(this); 
MainActivity.adapter.notifyDataSetChanged(); 

첫 번째 줄은 MainActivity.dataadapter.data을 (그들이 때문에 어댑터가 구축 된 방법에 동일한 목록있어, 기억) 웁니다. 두 번째 줄은 MainActivity.data에 새 목록을 할당하지만 어떤 식 으로든 adapter.data에는 영향을 미치지 않습니다. 세 번째 행은 데이터 세트가 변경되었음을 어댑터에 알리지 만 (지워졌으므로 지워졌습니다) 어댑터가 dbh.ReadNotilist()에서 새 정보를 "보지"않습니다. MainActivity.dataadapter.data 여전히 같은 List를 가리키는 대신 할당 (=)의 addAll() 의미를 사용하기 때문에 어댑터가 새 정보 "를 참조하십시오"때문에

AChez9의 대답은 작동합니다.

외부 출처에서 받아 들인 경우 사본 목록을 작성하는 것이 올바른 경우가 종종 있습니다. 즉, 어댑터의 생성자는이 작업을 수행 할 수 있습니다 : 이것은 (이 경우, MainActivity.data에) 전달 된 목록에 대한 변경에서 "안전"는 것을 의미합니다

this.data = new ArrayList<>(data); 

. 그러나 이는 또한 활동을 통해 어댑터를 올바르게 업데이트 할 수있는 방법을 폭로해야 함을 의미합니다. 다음과 같은 방법을 권하고 싶습니다.

public void updateData(List< NotificationItemInformation> data) { 
    this.data = new ArrayList<>(data); 
    notifyDataSetChanged(); 
} 
관련 문제