package com.lq.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import com.lq.xpressmusic.R; import com.lq.entity.TrackInfo; /** * @author lq 2013-6-1 lq2625304@gmail.com * */ public class TrackMutipleChooseAdapter extends BaseAdapter { /** 数据源 */ private ArrayList<TrackInfo> mData = null; /** 上下文对象 */ private Context mContext = null; /** 存储每个条目勾选的状态 */ private SparseBooleanArray mCheckedStates = null; public TrackMutipleChooseAdapter(Context c, ArrayList<TrackInfo> list) { mData = list; mContext = c; mCheckedStates = new SparseBooleanArray(); if (mData != null) { // 初始状态时所有条目都不勾选 for (int i = 0; i < mData.size(); i++) { mCheckedStates.put(i, false); } } } /** * 全选或全不选 * * @param selectAll * true表示全选,false表示全不选 */ public void selectAllItem(boolean selectAll) { if (selectAll) { for (int i = 0; i < mData.size(); i++) { mCheckedStates.put(i, true); } } else { for (int i = 0; i < mData.size(); i++) { mCheckedStates.put(i, false); } } notifyDataSetChanged(); } public long[] getSelectedAudioIds() { int[] checkedPostions = getSelectedItemPositions(); long[] selectedAudioIds = new long[checkedPostions.length]; for (int i = 0; i < checkedPostions.length; i++) { selectedAudioIds[i] = getItem(checkedPostions[i]).getId(); } return selectedAudioIds; } public String[] getSelectedAudioPaths() { int[] checkedPostions = getSelectedItemPositions(); String[] selectedAudioPaths = new String[checkedPostions.length]; for (int i = 0; i < checkedPostions.length; i++) { selectedAudioPaths[i] = getItem(checkedPostions[i]).getData(); } return selectedAudioPaths; } public List<TrackInfo> getSelectedItems() { int[] checkedPostions = getSelectedItemPositions(); List<TrackInfo> list = new ArrayList<TrackInfo>(); for (int i = 0; i < checkedPostions.length; i++) { list.add(getItem(checkedPostions[i])); } return list; } /** * 获得已选择的条目们在列表中的位置 * * @return 所有已选择的条目在列表中的位置 */ public int[] getSelectedItemPositions() { int count = 0; for (int i = 0; i < mCheckedStates.size(); i++) { if (mCheckedStates.get(i)) { count++; } } int[] checkedPostions = new int[count]; for (int i = 0, j = 0; i < mCheckedStates.size(); i++) { if (mCheckedStates.get(i)) { checkedPostions[j] = i; j++; } } return checkedPostions; } /** * 改变指定位置条目的选择状态,如果已经处于勾选状态则取消勾选,如果处于没有勾选则勾选 * * @param position * 要改变的条目选择状态的位置 */ public void toggleCheckedState(int position) { if (position >= 0 && position < mCheckedStates.size()) { if (mCheckedStates.get(position)) { mCheckedStates.put(position, false); } else { mCheckedStates.put(position, true); } notifyDataSetChanged(); } } @Override public int getCount() { return mData.size(); } @Override public TrackInfo getItem(int position) { return mData.get(position); } @Override public boolean isEmpty() { if (mData == null) { return true; } else if (mData.size() == 0) { return true; } else { return false; } } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.list_item_track_mutiple, parent, false); holder.track_name = (TextView) convertView .findViewById(R.id.textview_music_title); holder.artist = (TextView) convertView .findViewById(R.id.textview_music_singer); holder.checkbox = (CheckBox) convertView .findViewById(R.id.cb_track_mutiple); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.track_name.setText(getItem(position).getTitle()); holder.artist.setText(getItem(position).getArtist()); if (mCheckedStates.get(position)) { holder.checkbox.setChecked(true); } else { holder.checkbox.setChecked(false); } return convertView; } static class ViewHolder { TextView track_name; TextView artist; CheckBox checkbox; } }