ListView Multiselection

Ich habe versucht, die Mehrfachauswahl auf Android ListView zu implementieren. Ich möchte mehr als ein Element auswählen / die Auswahl aufheben und diese Elemente sollten hervorgehoben bleiben oder nicht. Ich möchte keine Kontrollkästchen zum Auswählen der Elemente verwenden.

Ich habe die Funktionalität in meinen Adapter gesteckt. Hier ist der Code:

public class MultiSelectionAdapter extends BaseAdapter {

private List<Event> streams;
private LayoutInflater inflater;
private Context context;

// I keep the selected items index.
private static List<Integer> selectedIndexList = new ArrayList<Integer>();


public MultiSelectionAdapter(Context context, List<Event> streams) {
    this.streams = streams;
    this.inflater = LayoutInflater.from(context);
    this.context = context;

    selectedIndexList.clear();
    Integer i = -1;
    selectedIndexList.add(i);
}



@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;

    //if (convertView == null) {
        convertView = inflater.inflate(R.layout.adapter_stream_ins, null);
        holder = new ViewHolder();
        holder.hTitle = (TextView) convertView.findViewById(R.id.adapter_title);
        holder.hProfileImage = (ImageView) convertView.findViewById(R.id.adapter_profileimage);
        holder.hMainImage = (WebImageView) convertView.findViewById(R.id.adapter_mainimage);
        //convertView.setTag(holder);
    //} else {
    //  holder = (ViewHolder) convertView.getTag();
    //}


    for(Integer i : selectedIndexList){
        if (position == i) {
            // Here I get the view inside the layout and set it to enable (the item has a selector as background) 
            RelativeLayout mainLayout = (RelativeLayout) ((ViewGroup) convertView).getChildAt(1);
            LinearLayout item = (LinearLayout) ((ViewGroup) mainLayout).getChildAt(1);
            item.setSelected(true);
        }
    }


    Ins eventItem = (Inspiration) getItem(position);
    holder.hTitle.setText(eventItem.getName());
    holder.hMainImage.setImageWithURL(context, WebServiceConfig.getImageUrl(eventItem.getImagePath()));

    return convertView;
}



public int getCount() {
    return this.streams.size();
}

public Event getItem(int position) {
    return this.streams.get(position);
}

public long getItemId(int position) {
    return position;
}

public void add(Event e) {
    streams.add(e);
}

public void addAll(List<Event> events) {
    streams.addAll(events);
}

public void remove(Event e) {
    streams.remove(e);
}



public void setSelectdIndexList(List<Integer> l){
    selectedIndexList = l;
    notifyDataSetChanged();
}


class ViewHolder {
    TextView hTitle;
    ImageView hProfileImage;
    WebImageView hMainImage;
}

}

In meiner Aktivität speichere ich die ausgewählten Elemente und die Indizes in einer Liste

public List<Event> insSelected = new ArrayList<Event>();
public static List<Integer> selecteditems = new ArrayList<Integer>();

Schließlich aktualisiere ich in der ListView-Methode setOnItemClickListener die Liste und den Adapter.

streamsListView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {   
            Ins selectedItem = (Ins) streamsListView.getItemAtPosition(position);


            if(insSelected.contains(selectedItem)){
                insSelected.remove(selectedItem);

                selecteditems.remove((Integer)position);
                eventAdapter.setSelectdIndexList(selecteditems);
                eventAdapter.notifyDataSetChanged();
            }else{
                insSelected.add(selectedItem);

                selecteditems.add((Integer)position); 
                eventAdapter.setSelectdIndexList(selecteditems);
                eventAdapter.notifyDataSetChanged();
            }

        }
    });

Ich weiß, dass mein Code im Adapter völlig ineffizient ist, da ich die ListView jedes Mal zeichnen muss, wenn ich ein Element auswähle oder abwähle.

Irgendwelche Ideen, wie man es verbessern kann? Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage