Получение неправильных позиций в Listview при прокрутке - PullRequest
0 голосов
/ 11 февраля 2019

Я использую Customadapter для моего списка.В моей Деятельности у меня есть некоторые Слушатели, чтобы помечать выбранные элементы (сначала нажатием на журнал, затем коротким нажатием). Это работает, пока список не станет достаточно большим, чтобы стать прокручиваемым.В этом случае, если я отмечу один элемент и прокручиваю вниз, есть и другие элементы, которые также отмечены, и если я прокручиваю быстро, отмеченные элементы изменятся.Я слышал, что ListView каким-то образом перерабатывает позиции или что-то в этом роде, но я думаю, что позиция должна оставаться прежней.

Вот мой CustomAdapter: (если вы видите некоторые возможности для улучшения производительности, упомяните об этом)

public class CustomAdapterMain extends BaseAdapter {

private ArrayList<Kontakt> listItems;
private LayoutInflater layoutInflater;
private Kontakt kontakt;
private int position;
private ViewHolder viewHolder;
private Integer Kalenderjahr=Calendar.getInstance().get(Calendar.YEAR);
private Integer Kalendermonat=Calendar.getInstance().get(Calendar.MONTH);
private Integer Kalendertag=Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
TinyDB tinyDB;

public CustomAdapterMain(Context context, ArrayList<Kontakt> arrayList){
    listItems=arrayList;
    //layoutInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    layoutInflater=LayoutInflater.from(context);
    tinyDB= new TinyDB(context);
}

@Override
public int getCount() {
    return listItems.size();
}

@Override
public Kontakt getItem(int position) {
    return listItems.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View view, ViewGroup parent){
    if(view==null){
        viewHolder=new ViewHolder();
        view=layoutInflater.inflate(R.layout.chat_list_view_item, parent, false);
        viewHolder.listView=view.findViewById(R.id.Chats);
        viewHolder.Kontaktname=view.findViewById(R.id.kontakt_item_name_chat);
        viewHolder.Chatsnippet=view.findViewById(R.id.kontakt_item_chatsnippet);
        viewHolder.Uhrzeit=view.findViewById(R.id.kontakt_item_uhrzeit);
        view.setTag(viewHolder);
    }
    else{
        viewHolder=(ViewHolder)view.getTag();
    }
    Kontakt kontaktItem=listItems.get(position);
    if(kontakt!=null){
        viewHolder.kontakt.setKontakt(kontaktItem);
    }
    else{
        //viewHolder.kontakt=kontaktItem.getKontakt();

    }

    String last_massage=tinyDB.getString(kontaktItem.getNummer()+"text");
    String last_massage_time=tinyDB.getString(kontaktItem.getNummer()+"time");
    String[] Uhrzeit=last_massage_time.split(" ");
    String[] Datum=Uhrzeit[0].split("-");
    String[] Stunden=Uhrzeit[1].split(":");

    Integer Jahr=Integer.parseInt(Datum[0]);
    Integer Monat=Integer.parseInt(Datum[1]);
    Integer Tag=Integer.parseInt(Datum[2]);

    if(Jahr<Kalenderjahr||Monat<Kalendermonat||Tag+1<Kalendertag){
        viewHolder.Uhrzeit.setText(Tag+"."+Monat+"."+Jahr%1000);
    }
    else if(Tag<Kalendertag){
        viewHolder.Uhrzeit.setText(R.string.gestern);
    }
    else{
        viewHolder.Uhrzeit.setText(Stunden[0]+":"+Stunden[1]);
    }

    viewHolder.Kontaktname.setText(kontaktItem.getName());
    viewHolder.Chatsnippet.setText(last_massage);
    //set Image from server

    return view;
}
}

Мои onClickListeners: (также пробовал parent.getChildAt (position) .setBackgroundColor (getResources ().getColor (R.color.orange));)

 Chats=findViewById(R.id.Chats);
    final CustomAdapterMain customadapter=new                                           CustomAdapterMain(YouniChat_MainActivity.this,ArrayListChats);
    Chats.setAdapter(customadapter);
 Chats.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
            hasClicked.put(position,false);
            view.setBackgroundColor(getResources().getColor(R.color.orange));
            marked++;
            Chats.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView parent, View view, int position, long id) {
                    if(hasClicked.get(position,true)) {
                        view.setBackgroundColor(getResources().getColor(R.color.orange));
                        marked++;
                        hasClicked.put(position, false);
                    }
                    else{
                        view.setBackgroundColor(0);
                        marked--;
                        hasClicked.put(position, true);
                    }
                    if(marked>0){
                        findViewById(R.id.delete).setVisibility(View.VISIBLE);
                    }
                    else{
                        findViewById(R.id.delete).setVisibility(View.INVISIBLE);
                        onClickListener();
                    }
                }
            });
            if(marked>0) {
                findViewById(R.id.delete).setVisibility(View.VISIBLE);
            }
            else{
                findViewById(R.id.delete).setVisibility(View.INVISIBLE);
                onClickListener();
            }
            return true; //damit nicht der OnItemClickListener reagiert
        }
    });
...