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

有的时候,会有这样的需求,在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肯定已经是后台修改过的了,就不需要,我们再进行手动修改了

你可能感兴趣的:(android技术)