Min app krasjer med addAll (int indeks, Collection c) i eldre versjon av Android (Ikke fordi underliste)

stemmer
0

Jeg prøver å legge til nye elementer i en listevisning throug den addAll metoden, og jeg kan gjøre det på den nyeste versjonen av Android, men når jeg prøver i eldre versjoner den kræsjer.

Kan noen hjelpe meg å forstå hvorfor og hvordan å fikse det.

Funksjon hvor jeg får feil

public void appendMessages(List<Message> moreMessages){
        this.messages.addAll(0,moreMessages);
    }

Jeg trenger å legge dem på toppen av listen.

Feil

09-19 13:12:59.437 12909-12909/com.example.rjrod.legendchat E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.rjrod.legendchat, PID: 12909
    java.util.ConcurrentModificationException
        at java.util.AbstractList$SubAbstractList.size(AbstractList.java:360)
        at java.util.AbstractList$SubAbstractList.addAll(AbstractList.java:265)
        at com.example.rjrod.legendchat.adapter.MensagemAdapter.appendMessages(MensagemAdapter.java:136)
        at com.example.rjrod.legendchat.MainActivity$2.onScroll(MainActivity.java:169)
        at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1461)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4987)
        at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3398)
        at android.widget.AbsListView.onTouchMove(AbsListView.java:3774)
        at android.widget.AbsListView.onTouchEvent(AbsListView.java:3612)
...

Hvor jeg kaller det

listMensages.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                Log.d(TAG, onScroll:  + view.getFirstVisiblePosition() +   + listMensages.getCount() +  + (19*(k)-visibleItemCount) +  + k+  +numberLists);


                if(view.getFirstVisiblePosition() == 0 && listMensages.getCount()>=19*(k)-visibleItemCount && k<numberLists && k>=1 && k!=z){

                    Log.d(TAG, ENTREI:  + z +   + k);


                        adapter.appendMessages(messagesList.subList(messagesList.size()-20*(k+1),messagesList.size()-21-((k-1)*20)));
                        adapter.notifyDataSetChanged();
                        listMensages.smoothScrollToPosition(19);
                        z=k;
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            k++;
                        }
                    }, 100);


                        //loaded=true;
                    }
                    if(view.getFirstVisiblePosition() == 0 && listMensages.getCount()>=19-visibleItemCount && k==numberLists){
                        Log.d(TAG, ENTREI 2: );

                        adapter.appendMessages(messagesList.subList(messagesList.indexOf(messagesList.get(0)),messagesList.size()-21-((k-1)*20)));
                        adapter.notifyDataSetChanged();
                        listMensages.smoothScrollToPosition(19);
                        k++;
                    }
                    if(k==0){
                        k=1;
                    }



            }
        });

Hvis noe annet er nødvendig bare fortelle meg og jeg vil legge det til. (I trenger dette for å arbeide fra minst SDK 21)

Takk

Adapter

public class MensagemAdapter extends ArrayAdapter<Message> {

    private Context context;
    private List<Message> messages;
    private List<Users> users;
    private static final String TAG = MensagemAdapter;


    public MensagemAdapter(@NonNull Context context, @NonNull List<Message> objects, @NonNull List<Users> users) {
        super(context, 0, objects);
        this.context=context;
        this.messages = objects;
        this.users = users;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View view = null;
        //Log.d(TAG, getView:  + position);


            if (messages != null) {

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
                Message message = messages.get(position);
                //Log.d(Num, getView:  + message.getUserId() +   + message.getId());
                if (message.getUserId() == 1) {
                    assert inflater != null;
                    view = inflater.inflate(R.layout.right_no_attach, parent, false);
                    TextView textoMensagem = view.findViewById(R.id.tv_mensage);
                    textoMensagem.setText(message.getContent());
                    if (message.getAttachments() != null) {

                        for (int i = 0; i < message.getAttachments().size(); i++) {
                            //view = inflater.inflate(R.layout.right_attach,parent,false);
                            if (i == 0) {
                                ImageView attach = view.findViewById(R.id.imageView1);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);

                            } else if (i == 1) {
                                ImageView attach = view.findViewById(R.id.imageView2);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                            } else if (i == 2) {
                                ImageView attach = view.findViewById(R.id.imageView3);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                            } else {
                                ImageView attach = view.findViewById(R.id.imageView3);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                            }

                        }
                    }

                } else {
                    assert inflater != null;
                    view = inflater.inflate(R.layout.left_no_attach, parent, false);
                    TextView nomeMensagem = view.findViewById(R.id.nomeId);
                    nomeMensagem.setText(users.get(message.getUserId() - 1).getName());
                    ImageView avatar = view.findViewById(R.id.avatarIm);
                    Picasso.get().load(users.get(message.getUserId() - 1).getAvatarId()).transform(new CircleTransform()).into(avatar);
                    TextView textoMensagem = view.findViewById(R.id.tv_mensage);
                    textoMensagem.setText(message.getContent());
                    if (message.getAttachments() != null) {

                        for (int i = 0; i < message.getAttachments().size(); i++) {
                            //view = inflater.inflate(R.layout.right_attach,parent,false);
                            if (i == 0) {
                                ImageView attach = view.findViewById(R.id.imageViewA);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);

                            } else if (i == 1) {
                                ImageView attach = view.findViewById(R.id.imageViewB);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                            } else if (i == 2) {
                                ImageView attach = view.findViewById(R.id.imageViewC);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                            } else {
                                ImageView attach = view.findViewById(R.id.imageViewD);
                                attach.setVisibility(View.VISIBLE);
                                Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                            }

                        }
                    }

                }


                if (message.getAttachments() == null) {
                    TextView textoMensagem = view.findViewById(R.id.tv_mensage);

                    textoMensagem.setText(message.getContent());
                }



        }
        return view;
        }


    public void appendMessages(List<Message> moreMessages){
        Log.d(TAG, appendMessages:  + this.messages +   + moreMessages);
        this.messages.addAll(moreMessages);

    }


    }
Publisert på 19/09/2018 klokken 13:21
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Problemet er at du prøver å endre listen, mens listen er allerede endret et annet sted, slik at du får ConcurrentModificationException.

Prøv å begrense listen modifikasjoner til en enkelt tråd for eksempel UI. Fra postet code Jeg antar samtidighet skjer i onScollmetoden som blir kalt gjentatte ganger mens listen modifisering ikke er ferdig ennå. Her er et enkelt eksempel med å flytte adapter.appendMessages()funksjonen til UI tråden køen:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.appendMessages(messagesList.subList(messagesList.indexOf(messagesList.get(0)),messagesList.size()-21-((k-1)*20)));
        adapter.notifyDataSetChanged();
        listMensages.smoothScrollToPosition(19);
        ...
    }
});
Svarte 19/09/2018 kl. 15:27
kilden bruker

stemmer
0

For å fikse turen problemet bare endre adapter konstruktøren.

public MensagemAdapter(@NonNull Context context, @NonNull List<Message> objects, @NonNull List<Users> users) {
        super(context, 0,  new ArrayList<>(objects));
        this.context=context;
        this.messages =   new ArrayList<>(objects);
        this.users = users;
    }
Svarte 19/09/2018 kl. 14:46
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more