有的时候,会有这样的需求,在listview,GridView这种复用型控件中,实现单个item点击,item内容变色,或者item背景改变,当点击了第一个item,item背景改变,当点击第二个item,第一个恢复,第二个改变背景;
大概就是这样的需求了。
其实,实现起来也是比较简单的,总的来说有两种思路:
第一种思路:
首先,在适配器中
定义一个int变量,用于记录点击下去的那个item的position;
然后定义一个public的动态设置这个position的方法,该方法还是在adapter中,只是他是public的,所以可以直接使用adapter点的方式直接调用,直接设置点击下去的那个position进去,然后在activity中,adapter.notifyDataSetChanged();刷新一下整个listview或者GridView的数据就搞定了;
并在getview中判断,getview的position是否==这个position,如果等于就做改变背景的操作,否则不改变;
代码:
适配器
public class TimeAdapter extends BaseAdapter {
private List list;
private Context context;
private int location;
public TimeAdapter(Context context,List list){
this.context=context;
this.list=list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressWarnings("deprecation")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderTime holder=null;
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.teacher_grown_choicetime_horizontal_item,
parent, false);
holder=new ViewHolderTime();
holder.week=(TextView) convertView.findViewById(R.id.recyle_1);
holder.time=(TextView) convertView.findViewById(R.id.recyle_2);
convertView.setTag(holder);
}else{
holder=(ViewHolderTime) convertView.getTag();
}
if(location==position){
holder.week.setTextColor(context.getResources().getColor(R.color.pink));
holder.time.setTextColor(context.getResources().getColor(R.color.pink));
}else{
holder.week.setTextColor(context.getResources().getColor(R.color.back3));
holder.time.setTextColor(context.getResources().getColor(R.color.gray3));
}
if(position==0){
holder.week.setText("今天");
holder.time.setText(list.get(position).getShortDate());
}else if(position==1){
holder.week.setText("明天");
holder.time.setText(list.get(position).getShortDate());
}else{
holder.week.setText(list.get(position).getWeek());
holder.time.setText(list.get(position).getShortDate());
}
return convertView;
}
public class ViewHolderTime{
public TextView week,time;
}
public void setSeclection(int position) {
location = position;
}
}
activity中,
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view,
int position, long id) {
timeAdapter.setSeclection(position);
timeAdapter.notifyDataSetChanged();
}
});
第二种思路:
这种思路更倾向于点击item后发起了一个网络请求,这种场景。
解析数据的bean中有一个Boolean的flag,用于标识,该数据单元的一个状态,后面,在adapter中,就可以根据这个flag来在getview中进行item字体的判断,颜色背景的设置,点击item后,可以手动修改点击的这一项的position位置的bean数据中的flag,然后notify adapter,就OK了。
adapter中定义一个全局的int变量clickPosition用于记录点击的那一项item的position,然后再网络回调中,如果网络请求成功了,则通过((Bean)adapter.getItem(clickPosition)).setFlag修改标识,然后notify这个adapter就OK了,在adapter的getView方法中,通过这个flag来设置item的背景颜色,字体颜色。
至于可以点击,不可以点击,则在item点击方法中进行判断就OK了,
boolean clickable = ((TeacherGrownStoreTimeBean) storeAdapter
.getItem(position)).getStatus() == 0 ? false : true;
if (clickable) {
dialogTip(timeTypeId, startTime);
} else {
Toast.makeText(TeacherGrownGetorderChoicetimeActivity.this,
"该时间不可预订", Toast.LENGTH_SHORT).show();
}
}
在网络请求回调中:
if (isScuess) {
Toast.makeText(TeacherGrownGetorderChoicetimeActivity.this,
“预约成功”, Toast.LENGTH_LONG).show();
/预约成功,通知adapter,将该时间段置为不可预约状态,不再请求网络
((Bean)(storeAdapter.getItem(clickPosition))).setFlag(false);
storeAdapter.notifyDataSetChanged();
isScuess = false;
} else {
String entity = (String) result.getEntity();
Toast.makeText(TeacherGrownGetorderChoicetimeActivity.this,
"预约失败:" + entity, Toast.LENGTH_LONG).show();
}
其实,我们费心费力的,这么做,完全可以有一种更简单的方式,重新请求一次接口,重新请求一次网络数据,重新请求回来的list data,里面数据的flag肯定已经是后台修改过的了,就不需要,我们再进行手动修改了