android listview适配器进行监听组件出现问题

凸图土吐 2015-07-29 10:21:12

这个问题 折腾了好久 还是没解决....
问题现象是这样的,我点击某个item的textview ,要进行修改,然后导致所有item的这个textview都变成修改的值了

然后就去打断点,发现哪个item判断没错,然后去修改对应对象属性的时候,发现的确这个list里面所有对象的这个属性都被修改了

我的监听是写在适配器里面的,然后在getview里面对每个item的组件进行setTage,这样触发的时候就知道 是哪个item,然后根据组件id即view.getID()进行获取,就知道是哪个item的组件
现在贴上代码
适配器里的getview方法
public View getView(int position, View convertView, ViewGroup viewGroup) {
if (convertView == null) {
holder = new ViewHolder();
//conLayout=findViewById(R.id.controller_title_layout);
monInflater = (LayoutInflater) monContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//获得一个layoutInflater
convertView = monInflater.inflate(R.layout.list_table_timeset, null); //将布局绑定到View
holder.time_sel_beign = (TextView) convertView.findViewById(R.id.time_sel_beign);
holder.time_sel_end = (TextView) convertView.findViewById(R.id.time_sel_end);
holder.timeset_del = (ImageButton) convertView.findViewById(R.id.timeset_del);
holder.time_switch = (ImageButton) convertView.findViewById(R.id.time_switch);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();// 取出viewHolder对象
}
// 设置textview显示的内容
timePeriodCtr = timePeriodCtrList.getTimePeriodCtrs().get(position);
holder.time_sel_beign.setText(timePeriodCtr.getBeginTime());
holder.time_sel_end.setText(timePeriodCtr.getEndTime());
if (timePeriodCtr.getStatus().equals("1")) {
holder.time_switch.setBackgroundResource(R.drawable.time_on);
} else {
holder.time_switch.setBackgroundResource(R.drawable.time_off);
}
holder.timeset_del.setOnClickListener(this);
holder.timeset_del.setTag(position);
holder.time_switch.setOnClickListener(this);
holder.time_switch.setTag(position);
holder.time_sel_beign.setOnClickListener(this);
holder.time_sel_beign.setTag(position);
holder.time_sel_end.setOnClickListener(this);
holder.time_sel_end.setTag(position);
return convertView;
}

我的监听方法 贴上一部分监听代码
   @Override
public void onClick(View v) {
position=(int)v.getTag();
timePeriodCtr = (BeanTimePeriodCtr) getItem(position);
switch (v.getId()) {
case R.id.time_sel_beign:
new AlertDialog.Builder(monContext)
.setTitle("请选择开启的时间")
.setView(gettimepickerview())
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
//holder.time_sel_beign.setText(wheelMain.getTime());
timePeriodCtrList.getTimePeriodCtrs().get(position).setBeginTime("1");
notifyDataSetChanged();
Log.e("time",wheelMain.getTime());
}
}).setNegativeButton("取消", null).show();
break;}

希望大神们帮忙啊 小弟也是初学android 不久 也许范了一些基础问题

当然,各位大神 可以提议一些别的方法,也能达到我要的效果
...全文
198 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gao_chun 2015-07-29
  • 打赏
  • 举报
回复
引用 4 楼 u010049603 的回复:
我知道原因了 原因是这样的,我的原始数据源list.add的对象都是同一个,并没有new 我每次修改某个对象的时候,list中的每一个对象都是指向同一个对象 基础不扎实啊... 我add的时候 都new一个对象 就可以了 基础很重要!
多看几遍,下次再犯了直接打屁屁.
凸图土吐 2015-07-29
  • 打赏
  • 举报
回复
我知道原因了 原因是这样的,我的原始数据源list.add的对象都是同一个,并没有new 我每次修改某个对象的时候,list中的每一个对象都是指向同一个对象 基础不扎实啊... 我add的时候 都new一个对象 就可以了 基础很重要!
引用 楼主 u010049603 的回复:
这个问题 折腾了好久 还是没解决.... 问题现象是这样的,我点击某个item的textview ,要进行修改,然后导致所有item的这个textview都变成修改的值了 然后就去打断点,发现哪个item判断没错,然后去修改对应对象属性的时候,发现的确这个list里面所有对象的这个属性都被修改了 我的监听是写在适配器里面的,然后在getview里面对每个item的组件进行setTage,这样触发的时候就知道 是哪个item,然后根据组件id即view.getID()进行获取,就知道是哪个item的组件 现在贴上代码 适配器里的getview方法
public View getView(int position, View convertView, ViewGroup viewGroup) {
        if (convertView == null) {
            holder = new ViewHolder();
            //conLayout=findViewById(R.id.controller_title_layout);
            monInflater = (LayoutInflater) monContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//获得一个layoutInflater
            convertView = monInflater.inflate(R.layout.list_table_timeset, null); //将布局绑定到View
            holder.time_sel_beign = (TextView) convertView.findViewById(R.id.time_sel_beign);
            holder.time_sel_end = (TextView) convertView.findViewById(R.id.time_sel_end);
            holder.timeset_del = (ImageButton) convertView.findViewById(R.id.timeset_del);
            holder.time_switch = (ImageButton) convertView.findViewById(R.id.time_switch);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();// 取出viewHolder对象
        }
        // 设置textview显示的内容
        timePeriodCtr = timePeriodCtrList.getTimePeriodCtrs().get(position);
        holder.time_sel_beign.setText(timePeriodCtr.getBeginTime());
        holder.time_sel_end.setText(timePeriodCtr.getEndTime());
        if (timePeriodCtr.getStatus().equals("1")) {
            holder.time_switch.setBackgroundResource(R.drawable.time_on);
        } else {
            holder.time_switch.setBackgroundResource(R.drawable.time_off);
        }
        holder.timeset_del.setOnClickListener(this);
        holder.timeset_del.setTag(position);
        holder.time_switch.setOnClickListener(this);
        holder.time_switch.setTag(position);
        holder.time_sel_beign.setOnClickListener(this);
        holder.time_sel_beign.setTag(position);
        holder.time_sel_end.setOnClickListener(this);
        holder.time_sel_end.setTag(position);
        return convertView;
    }
我的监听方法 贴上一部分监听代码
   @Override
    public void onClick(View v) {
        position=(int)v.getTag();
        timePeriodCtr = (BeanTimePeriodCtr) getItem(position);
        switch (v.getId()) {
            case R.id.time_sel_beign:
                new AlertDialog.Builder(monContext)
                        .setTitle("请选择开启的时间")
                        .setView(gettimepickerview())
                        .setPositiveButton("确定",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        //holder.time_sel_beign.setText(wheelMain.getTime());
                                        timePeriodCtrList.getTimePeriodCtrs().get(position).setBeginTime("1");
                                        notifyDataSetChanged();
                                        Log.e("time",wheelMain.getTime());
                                    }
                                }).setNegativeButton("取消", null).show();
                break;}
希望大神们帮忙啊 小弟也是初学android 不久 也许范了一些基础问题 当然,各位大神 可以提议一些别的方法,也能达到我要的效果
凸图土吐 2015-07-29
  • 打赏
  • 举报
回复
补充一下 timePeriodCtrList是数据源
凸图土吐 2015-07-29
  • 打赏
  • 举报
回复
引用 1 楼 lxfhjjsfq 的回复:
代码不全,不好判断,你的 监听里的 position哪里定义的
在适配器里定义的position
_xianfeng99 2015-07-29
  • 打赏
  • 举报
回复
代码不全,不好判断,你的 监听里的 position哪里定义的

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧