4

我试图在 Android ListView 上实现多选。我想选择/取消选择多个项目,这些项目应保持突出显示。我不想使用 CheckBoxs 来选择项目。

我把功能放在我的适配器中。这是代码:

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;
}

}

我的活动我将所选项目和索引保存在列表中

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

最后在 ListView setOnItemClickListener 方法中,我更新了列表和适配器。

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();
            }

        }
    });

我知道我在适配器中的代码效率很低,因为每次选择或取消选择一个项目时我都必须绘制 ListView。

关于如何改进它的任何想法?谢谢!

4

1 回答 1

0

这是我用来创建自定义适配器的代码示例。第一个函数用于从您的主要活动中调用自定义适配器。ListAdapter 是您要调用的自定义 Java 文件。

List<ListAdapter> CustomAdapterList = new ArrayList<CustomAdapterList>();//List  with items to send to the custom adapter

List<String> items = new ArrayList<String>();
private void populateCustomList()
{
    ArrayAdapter<ListAdapter> Population= new CustomAdapter();
    ListView list= (ListView)findViewById(R.id.listView);
    list.setAdapter(Population);
}

private class CustomAdapter extends ArrayAdapter<ListAdapter>
{
    public CustomAdapter (){super(Settings.this,R.layout.listadapter,CustomAdapterList);}

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View itemView = convertView;
        if (itemView == null)
        {
            itemView = getLayoutInflater().inflate(R.layout.listadapter, parent, false);
        }
        final ListAdapter Position = CustomAdapterList.get(position);

        final TextView tv= (TextView)itemView.findViewById(R.id.tv);
        tv.setText(Position.getText());

        final RelativeLayout layout= (RelativeLayout)itemView.findViewById(R.id.layoutID);

        layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) 
            {
            if(!items.contains(Position.getText())
            {
                 items.add(Position.getText());
                 layout.setBackgroundColor(Color.parseColor("")); //input RGB value of selected item
            }
            else()
            {
                items.remove(Position.getText());
                layout.setBackgroundColor(Color.parseColor("")); //Input RGB value of unselected colour
            }
            }
        });

        return itemView;
    }
}

这将更改您单击的项目的布局颜色,并将它们添加到您想要使用它们的列表中。它还会在选择后更改颜色并从列表中删除该项目。

ListAdapter 类如下:

public class ListAdapter{


String text;

public ListAdapter(String text)
{
    super();
    this.text= text;

}

public String getText()
{
    return text;
}

public void setText(String text)
{
    this.text= text;
}


}

我希望这有帮助。PS。listadapter.xml 仅包含一个相对布局中的文本视图。

于 2016-10-07T14:59:37.380 回答