您的位置:首页 > 其它

listview、GridView单点击效果,点击改变背景改变item字体颜色实现

2016-12-13 14:19 786 查看
有的时候,会有这样的需求,在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肯定已经是后台修改过的了,就不需要,我们再进行手动修改了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: