android recyclerview

Odpowiedz Nowy wątek
2018-02-26 18:24
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

edytowany 2x, ostatnio: Patryk Fy, 2018-02-26 18:27

Pozostało 580 znaków

2018-02-26 20:11
Pendzoncy jelen
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

Pozostało 580 znaków

2018-02-26 20:12
Pendzoncy jelen
0

zamiast core mialo byc cloud. chodzi o layout cloud

Pozostało 580 znaków

2018-02-26 20:36
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.

Pozostało 580 znaków

2018-02-26 20:58
Pendzoncy jelen
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

Pozostało 580 znaków

2018-02-26 21:02
Pendzoncy jelen
0

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

Pozostało 580 znaków

2018-02-26 23:04
Zimny Szewc
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-dev[...]ing-recyclerview-db7c40d9f0e4

Pozostało 580 znaków

2018-02-27 01:00
0

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

Pozostało 580 znaków

2018-02-27 10:12
EloMoto
0

Do bindowania powinno używać się data bindibg

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

Pozostało 580 znaków

2018-02-27 21:26
Pendzoncy jelen
0

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

sprawdz sobie tutaj,
https://developer.android.com[...]get/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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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