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 {
}
activity中,
gridview.setOnItemClickListener(new OnItemClickListener() {
第二种思路:
这种思路更倾向于点击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);
}
在网络请求回调中:
if (isScuess) {
Toast.makeText(TeacherGrownGetorderChoicetimeActivity.this,
“预约成功”, Toast.LENGTH_LONG).show();
其实,我们费心费力的,这么做,完全可以有一种更简单的方式,重新请求一次接口,重新请求一次网络数据,重新请求回来的list data,里面数据的flag肯定已经是后台修改过的了,就不需要,我们再进行手动修改了
大概就是这样的需求了。
其实,实现起来也是比较简单的,总的来说有两种思路:
第一种思路:
首先,在适配器中
定义一个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肯定已经是后台修改过的了,就不需要,我们再进行手动修改了
相关文章推荐
- 实现listview条目点击后改变item背景颜色和字体颜色并保留
- gridview,点击选中一个或多个item,并改变item背景颜色,字体等
- GrideView点击某个item实现选中效果,改变item的背景颜色
- 动态改变Listview的item背景颜色和item中字体的颜色
- ListView中TextView和item背景点击改变颜色
- 点击listview,改变item的背景颜色设置
- android Gridview 点击某个item 改变item的背景(不是点击效果是选中效果)
- Button点击背景和字体颜色改变的实现方法
- Android开发实现ListView点击item改变颜色功能示例
- C# winform中,简单实现Listview.Subitem.BackColor.ForeColor改变字体颜色,Listview.Subitem.BackColor 改变背景
- C# winform中,简单实现Listview.Subitem.BackColor.ForeColor改变字体颜色,Listview.Subitem.BackColor 改变背景
- android gridview点击子选项动态改变item背景颜色
- 点击listviewItem后,改变当前Item背景色和字体颜色,其他不变
- ScrollView、ListView、GridView去掉边缘的蓝边和滑动条,改变item点击效果
- ListView中的Button点击后相应的Item改变背景颜色
- 实现listview的条目点击后改变背景颜色
- 动态改变Listview的item背景颜色和item中字体的颜色
- android listview 设置点击item背景颜色效果
- Android 代码模拟ListView item的点击事件并且改变背景颜色(笔记)
- android ListView实现颜色交替并且有点击效果