![](/img/trans.png)
[英]Android NullPointerException while retrieving data from SQLite Database and storing it in an Array
[英]notifyDataSetChanged not working while retrieving SQLite Data
聲明
private List<SQLiteHelper> messages = new ArrayList<>();
privare MessagesAdapter mAdapter;
private RecyclerView messageList;
初始化
messageList = (RecyclerView) findViewById(R.id.message_list);
messageList.setHasFixedSize(true);
messageList.setLayoutManager(linearLayoutManager);
mAdapter = new MessagesAdapter(messages);
messageList.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
取
while (csr.moveToNext()) {
String mSender = csr.getString(csr.getColumnIndex(KEY_SENDER));
String mMessage = csr.getString(csr.getColumnIndex(KEY_MESSAGE));
String mTime = csr.getString(csr.getColumnIndex(KEY_TIME));
String mSeen = csr.getString(csr.getColumnIndex(KEY_SEEN));
String mTimer = csr.getString(csr.getColumnIndex(KEY_TIMER));
String mType = csr.getString(csr.getColumnIndex(KEY_TYPE));
messages.add(new SQLiteHelper(mSender, mMessage, mTime, mSeen, mTimer, mType));
mAdapter.notifyDataSetChanged();
}
提取數據沒有問題,但是在添加新數據時不會顯示,直到我關閉活動並再次打開它。 我知道stackoverflow有關於notifydatasetchanged不能正常工作的很多問題,但主要是關於listviews和recyclerviews的問題,而對於sqlite數據則沒有,所以我不確定這是否是正確的方法。 有人可以幫我嗎
適配器的完整代碼
public class MessagesAdapter extends RecyclerView.Adapter<MessagesAdapter.MessageViewHolder>{
ChatData mHelper;
Cursor csr;
private List<SQLiteHelper> mMessagesHelperList;
private FirebaseAuth mAuth;
public MessagesAdapter(List<SQLiteHelper> mMessagesHelperList) {
this.mMessagesHelperList = mMessagesHelperList;
}
public void updateData(List<SQLiteHelper> pMessages){
if(pMessages== null || pMessages.size()==0)
return;
if (pMessages!= null && pMessages.size()>0)
this.mMessagesHelperList.clear();
this.mMessagesHelperList.addAll(pMessages);
notifyDataSetChanged();
}
public class MessageViewHolder extends RecyclerView.ViewHolder{
public TextView messageText;
public MessageViewHolder(View view) {
super(view);
mHelper = new ChatData(view.getContext(),"MessagePlus",null,1);
csr = mHelper.getAllQuestions3();
messageText = (TextView)view.findViewById(R.id.message_text_layout);
}
}
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View V = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_activity_chat,parent,false);
mAuth = FirebaseAuth.getInstance();
return new MessageViewHolder(V);
}
@Override
public void onBindViewHolder(final MessageViewHolder holder, int position) {
String mSender = null;
String mMessage = null;
String mTime;
String mSeen = null;
String mTimer;
String mType;
SQLiteHelper messagesHelper = mMessagesHelperList.get(position);
if (mSender != null && mSender.equals("Me")) {
holder.messageText.setBackgroundColor(Color.BLUE);
holder.messageText.setTextColor(Color.WHITE);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.messageText.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
holder.messageText.setLayoutParams(params);
if (mSeen.equals("Yes")){
holder.messageText.setBackgroundColor(Color.CYAN);
}else{
holder.messageText.setBackgroundColor(Color.BLUE);
}
}else {
holder.messageText.setBackgroundColor(Color.GREEN);
holder.messageText.setTextColor(Color.BLACK);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.messageText.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
holder.messageText.setLayoutParams(params);
}
holder.messageText.setText(messagesHelper.getMessage());
}
@Override
public int getItemCount() {
return mMessagesHelperList.size();
}
}
您正在獲取活動中的數據,但沒有將新數據傳遞給Recyclerview適配器,當適配器列表更新時,notifyAdapter可以工作。 在您的情況下,您可以在適配器中創建一個方法來獲取新消息,每次添加新消息時都將調用該方法,並在那里通知適配器。
更新以下代碼:
while (csr.moveToNext()) {
String mSender = csr.getString(csr.getColumnIndex(KEY_SENDER));
String mMessage = csr.getString(csr.getColumnIndex(KEY_MESSAGE));
String mTime = csr.getString(csr.getColumnIndex(KEY_TIME));
String mSeen = csr.getString(csr.getColumnIndex(KEY_SEEN));
String mTimer = csr.getString(csr.getColumnIndex(KEY_TIMER));
String mType = csr.getString(csr.getColumnIndex(KEY_TYPE));
messages.add(new SQLiteHelper(mSender, mMessage, mTime, mSeen, mTimer, mType));
//mAdapter.notifyDataSetChanged();
mAdapter.updateData(messages);
}
在您的適配器類中:
void updateData(List<SQLiteHelper> pMessages){
if(pMessages== null || pMessages.size()==0)
return;
if (pMessages!= null && pMessages.size()>0)
this.messages.clear();
this.messages.addAll(pMessages);
notifyDataSetChanged();
}
希望能幫助到你
首先使用數據更新列表,然后在while循環外部使用notifyItemRangeInserted
while (csr.moveToNext()) {
String mSender = csr.getString(csr.getColumnIndex(KEY_SENDER));
String mMessage = csr.getString(csr.getColumnIndex(KEY_MESSAGE));
String mTime = csr.getString(csr.getColumnIndex(KEY_TIME));
String mSeen = csr.getString(csr.getColumnIndex(KEY_SEEN));
String mTimer = csr.getString(csr.getColumnIndex(KEY_TIMER));
String mType = csr.getString(csr.getColumnIndex(KEY_TYPE));
messages.add(new SQLiteHelper(mSender, mMessage, mTime, mSeen, mTimer, mType));
}
mAdapter.notifyItemRangeInserted(0,messages.size());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.