I tried to implement a multi-element in an Android ListView. I want to select / deselect more than one item, and these items should be highlighted or not. I do not want to use CheckBox to select items.
I put the function in my adapter. Here is the code:
public class MultiSelectionAdapter extends BaseAdapter {
private List<Event> streams;
private LayoutInflater inflater;
private Context context;
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;
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);
for(Integer i : selectedIndexList){
if (position == i) {
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;
}
}
I my activity I keep selected items and indexes in a list
public List<Event> insSelected = new ArrayList<Event>();
public static List<Integer> selecteditems = new ArrayList<Integer>();
Finally, in the ListView method setOnItemClickListener, I update the list and 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();
}
}
});
I know that my code in the adapter is completely inefficient, because I have to draw a ListView every time I select or deselect an item.
Any ideas on how to improve it? Thanks!
source
share