notifyDataSetChanged не работает при получении данных SQLite - PullRequest
0 голосов
/ 14 декабря 2018

Объявление

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 есть много вопросов о notifydatasetchange, которые не работают, но в основном это касается списков и повторных просмотров, и ни один из них не касается данных 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();
}

}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Сначала обновите ваш список данными, затем используйте notifyItemRangeInserted вне цикла while, как в

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());
0 голосов
/ 14 декабря 2018

Вы извлекаете данные в действии, но не передаете новые данные в адаптер 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();    
     }

Надеюсь, это поможет

...