android recyclerview

0

Witam, problem jak na filmiku:


main:

    public void onViewCreated(View view, Bundle savedInstanceState) {
        TextView name = (TextView) view.findViewById(R.id.chatContactName);
        TextView motd = (TextView) view.findViewById(R.id.chatContactMotd);
        name.setText(contact.name);
        motd.setText(contact.motd);

final RecyclerView list = (RecyclerView)view.findViewById(R.id.messageList);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this.getContext());
        list.setLayoutManager(mLayoutManager);
        list.setItemAnimator(new DefaultItemAnimator());
        list.setAdapter(new chatMessagesAdapter(core.user.getMessages(windowID), core));
        if(msgs.size() > 0) list.scrollToPosition(core.user.getMessages(windowID).size()-1);
        handler = new Handler(Looper.getMainLooper());
        runnable = new Runnable() {
            @Override
            public void run() {
                View view = getView();
                RecyclerView list = (RecyclerView)view.findViewById(R.id.messageList);
                list.getAdapter().notifyDataSetChanged();
                list.scrollToPosition(core.user.getMessages(windowID).size()-1);
                handler.postDelayed(this, 1000); 
            }
        };
        handler.postDelayed(runnable, 1000);
}

adapter:

   public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView message, author, msgtime;
        public MyViewHolder(View view) {
            super(view);
            message = (TextView)view.findViewById(R.id.msgText);
            author = (TextView)view.findViewById(R.id.msgAuthor);
            msgtime = (TextView)view.findViewById(R.id.msgTime);
            cloud = (LinearLayout)view.findViewById(R.id.msgCloud);
        }

        @TargetApi(Build.VERSION_CODES.M)
        public void bindViews(message xd) {
            message.setText(xd.msg);
            if(xd.owner == core.user.ID) {
                author.setText("Ty");
                cloud.setBackground(core.getResources().getDrawable( R.drawable.message));
            }else{
                author.setText(core.user.getContact(xd.owner).name);
                cloud.setBackground(core.getResources().getDrawable( R.drawable.message_from));
            }
            msgtime.setText(CONST.timeDiff(xd.time));
        }

    }

niby wszystko poprawnie, poza tłem

0

w MyViewHolder brakuje Ci pola dla cloud, czyli LinearLayout. nie wiem do czego przypisujesz ten core bo nie ma calej klasy ale chyba nie rozumiesz jak dziala RecyclerView. Masz stala liste elementow (najczesciej tylko ile miesci sie na ekranie + 2) i w miare przewijania nie sa tworzone nowe tylko te istniejace sie podmieniaja. Tak jak lancuch do roweru na zebatce, masz stala ilosc ktora sie przemieszcza xD dobra analogia.

w kazdym razie dodaj pole do tej klasy i zbinduj tam core, powinno dzialac.
w dodatku w layoutmanager chyba mozna ustawic ze elementy sa od konca i przyklejone od dolu,czyli tak jak chcesz miec w czacie. poczytaj

0

zamiast core mialo byc cloud. chodzi o layout cloud

0

funkcja getMessages() wyswietla okreslona ilosc wiadomosci, ale jak masz 3 wiadomosci to masz mniej niz pelen ekran....
zresztą cloud jest zbindowane

cloud = (LinearLayout)view.findViewById(R.id.msgCloud);

i, nie recyclerview nie tylko podmienia, ale dodawać też można,usuwac itd.notifyDataSetChanged();

jedyny problem jest przy dodawaniu.

1
  public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView message, author, msgtime;
        public MyViewHolder(View view) {

gdzie jest cloud bo nie widze. dodaj
LinearLayout cloud;
bo jak cloud masz w adapterze to sytuacja wyglada tak ze tworzysz 10 viewholderow, i kazdy z nich binduje swoj widok do cloud w klasie adapter a nie klasie myViewHolder czego wynikiem jest to co obserwujesz.

i sprawdz 2 flagi
LinearLayoutManager.setStackFromEnd(true)
oraz
LinearLayoutManager.setReverseLayout(true)

moga ci sie przydac

0

a najlepiej to zrob z MyViewHolder klase statyczna public static class i zobacz gdzie masz blad ;)

2

Do bindowania powinno używać się data bindibg. Tak jak autor próbuje już się tego nie robi. Do poczytania: https://medium.com/google-developers/android-data-binding-recyclerview-db7c40d9f0e4

0

ogarnięte, dzięki chłopaki ;)

0

Do bindowania powinno używać się data bindibg

databinding, przenoszenie kodu z javy/kotlina do xml'i, nie dzieki

0

i, nie recyclerview nie tylko podmienia, ale dodawać też można,usuwac itd.notifyDataSetChanged();

sprawdz sobie tutaj,
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html
nie musisz przeladowywac calego adaptera przez notifydatasetchange(), mozesz wywolywac inserty, move, change na poszczegolnych elementach badz na grupie elementow. jest to optymalniejsze i dodaje animacje.
w dodatku zapoznaj sie z funkcjonalnoscia hasStableIds(), jezeli jests w stanie zapewnic ze elementy beda mialy niezmienne id, to recyclerAdapter optymalniej zarzadza itemami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1