Данные, полученные из sqlite, не отображаются в программе - PullRequest
0 голосов
/ 20 декабря 2018
    messageList = (RecyclerView) findViewById(R.id.message_list);
    mRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
    linearLayoutManager = new LinearLayoutManager(getApplicationContext());

    messageList.setLayoutManager(linearLayoutManager);

    mAdapter = new MessagesAdapter(messages);
    messageList.setAdapter(mAdapter);

final MainData mHelper = new MainData(this);
    final Cursor csr = mHelper.getAllQuestions3();
            sqlite = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId);
            valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {

//I add the data from firebase to SQLITE here 


                while (csr.moveToNext()) {
                    String mSender = csr.getString(csr.getColumnIndex(KEY_SENDER));
                    String mMessage = csr.getString(csr.getColumnIndex(KEY_MESSAGE));
                    long mTime = csr.getLong(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, mType, mSeen, mTimer, mTime));
                    mAdapter.notifyDataSetChanged();
                }
                    mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).setValue(null);

        }
            @Override
            public void onCancelled(DatabaseError databaseError) {
        }
    };
            sqlite.addListenerForSingleValueEvent(valueEventListener);

Адаптер

public class MessagesAdapter extends RecyclerView.Adapter<MessagesAdapter.MessageViewHolder>{
ChatData mHelper;
Cursor csr;
private List<SQLiteHelper> mMessagesHelperList;
private FirebaseAuth mAuth;


public MessagesAdapter(List<SQLiteHelper> MessagesHelperList) {
    this.mMessagesHelperList = MessagesHelperList;
}


public class MessageViewHolder extends RecyclerView.ViewHolder{
    public TextView messageText;


    public MessageViewHolder(View view) {
        super(view);
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(view.getContext());


        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) {
    SQLiteHelper messagesHelper = mMessagesHelperList.get(position);

       holder.messageText.setText(messagesHelper.getMessage());
    }

@Override
public  int getItemCount() {
    return mMessagesHelperList.size();
}

У меня есть еще одно занятие, где я получаю данные sqlite и показываю их в обзоре утилизатора, и это работает, и я добился того же, что и этот.Здесь также раньше это работало, но затем я добавил некоторые функции и переместил некоторый код, и теперь он не работает, и я неоднократно проверял весь код, но все еще не находил, почему он не работает ...

Таблица и строки существуют с данными, а размер списка тоже не равен нулю

Просто обнаружил, что адаптер не вызывается, когда я добавляю в него логи.Вот в чем проблема, но не знаю почему

1 Ответ

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

Ваша проблема в том, что вы добавляете дополнительные сообщения в список, в котором вы впервые создали свой адаптер, чтобы

вместо

messages.add(new SQLiteHelper(mSender, mMessage, mType, mSeen, mTimer, mTime));
mAdapter.notifyDataSetChanged();

do

mAdapter.add(new SQLiteHelper(mSender, mMessage, mType, mSeen, mTimer, mTime));

и в вашем адаптере вы должны добавить такую ​​функцию добавления

public void add(SQLiteHelper item){
    if(mMessagesHelperList!=null){
        mMessagesHelperList.add(item);
        notifyDataSetChanged();
    }
}

также

у вас слишком много "мусора" в вашем коде, в вашем ValueEventListener вы пытаетесь прочитать значениякурсора, а не DS (DataSnapshot).так что, вероятно, ваш курсор там пуст.Если курсор пуст, вы не добавляете какой-либо элемент в адаптер, поэтому у адаптера нет элементов для отображения, поэтому onBindViewHolder правильно не вызывается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...