在ListView的使用过程,Android只提供了单击item显示高亮,却不能保持,本文介绍两种选中保持高亮的方法,仅供参考。先看效果图
方法一:图中list为方法1的实现,其核心思想为setTag(),
myList1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
if( ( (ListView)parent ).getTag() != null){
( (View)( ( ListView )parent ).getTag() ).setBackgroundDrawable(null);
}
( ( ListView )parent ).setTag(view);
view.setBackgroundColor(Color.RED);
}
});
当点击某个item的时候,先判断parent中是否有tag,如果有,将其背景设为空,然后给view标记tag,设置背景。根据Android源代码可知,该view是被点击的item。
public interface OnItemClickListener {
/**
* Callback method to be invoked when an item in this AdapterView has
* been clicked.
* <p>
* Implementers can call getItemAtPosition(position) if they need
* to access the data associated with the selected item.
*
* @param parent The AdapterView where the click happened.
* @param view The view within the AdapterView that was clicked (this
* will be a view provided by the adapter)
* @param position The position of the view in the adapter.
* @param id The row id of the item that was clicked.
*/
void onItemClick(AdapterView<?> parent, View view, int position, long id);
}
此方法极为简单。
方法二:图中name为方法2的实现,其核心是自定义adapter适配器,其优点是比较灵活。
package com.example.listviewtest;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private int selectItem = -1;
List<HashMap<String,String>> myList;
public MyAdapter(Context context,List<HashMap<String,String>> myList){
this.mInflater = LayoutInflater.from(context);
this.myList = myList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return myList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return myList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public void setSelectItem(int selectItem){
this.selectItem = selectItem;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.holder_layout, null);
holder.textName = (TextView)convertView.findViewById(R.id.name);
convertView.setTag(holder);
}
else
holder = (ViewHolder)convertView.getTag();
holder.textName.setText(myList.get(position).get("NAME"));
if(position == selectItem)
convertView.setBackgroundColor(Color.YELLOW);
else
convertView.setBackgroundColor(Color.TRANSPARENT);
return convertView;
}
static class ViewHolder{
TextView textName;
}
}
代码中List<>类型可根据实际需求来修改。该段代码的核心部分是getView().也是用setTag方式来实现,这里面一个重要参数为convertView,当某个item在滑动过程中被移除屏幕,Android会回收这个item的view,就是这个convertView,当有item被移出屏幕时,我们会new一个新的view给新显示的item,如果我们能使用convertView,则能节省大量内存开销,