这是我的第一篇博客,只是为了记录项目汇总遇到的问题,因此语言组织上不会太通俗易懂,不喜勿喷!
<ListView
android:id="@+id/phone_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:choiceMode="singleChoice"
android:divider="@color/linegrey"
android:dividerHeight="50dip"
android:scrollbars="none" />
将android:layout_height设置成wrap_content的话,adapter中的getview会执行两次,要让getview不执行两次只执行一次的话,可以将android:layout_height设置成fill_parent。
在开发中遇到这么个需求:linearlayout的上面是listview,下面是button,点击listview中的某一项,那一项的颜色就改变,属于单选模式。
如果将listview设置成fill_parent的话button就看不到了,所以必须设置成wrap_content,可设置成wrap_content的话getview又执行了两次。
为了实现这个效果,采用下面的做法:在adapter中创建一个hashmap<Integer,Boolean>用来存储list中的每一项是否被选中,在getview中判断是否被选中,在被选中时创建一个监听,listview所在的那个activity实现这个监听。
adapter代码如下:
public class PhoneAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<String> phoneList;
private LayoutInflater inflater;
private HashMap<Integer, Boolean> isSelected;
private SelectedLinstener selectedLinstener;
public PhoneAdapter(Context mContext, ArrayList<String> phoneList, SelectedLinstener selectedLinstener)
{
this.mContext = mContext;
this.phoneList = phoneList;
this.selectedLinstener = selectedLinstener;
inflater = LayoutInflater.from(mContext);
isSelected = new HashMap<Integer, Boolean>();
for(int i=0;i<phoneList.size();i++)
{
isSelected.put(i, false);
}
}
@Override
public int getCount() {
return phoneList.size();
}
@Override
public Object getItem(int position) {
return phoneList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("ResourceAsColor")
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView == null)
{
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.phone_item, null);
viewHolder.imageView = (ImageView)convertView.findViewById(R.id.select_img);
viewHolder.textView = (TextView)convertView.findViewById(R.id.phone_tv);
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.textView.setText(phoneList.get(position));
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean selected = !isSelected.get(position);
for(Integer p : isSelected.keySet()) {
isSelected.put(p, false);
}
isSelected.put(position, selected);
notifyDataSetChanged();
}
});
if(isSelected.get(position))
{
viewHolder.imageView.setImageResource(R.drawable.albumset_selected);
viewHolder.textView.setTextColor(mContext.getResources().getColor(R.color.vargoidblue));
selectedLinstener.selected();
}
else
{
viewHolder.imageView.setImageResource(R.drawable.albumset_preselected);
viewHolder.textView.setTextColor(mContext.getResources().getColor(R.color.textviewgrey));
}
return convertView;
}
static class ViewHolder
{
ImageView imageView;
TextView textView;
}
public interface SelectedLinstener
{
void selected();
}
}