2 qq 33230445 qq_33230445 于 2016.09.07 19:11 提问

Android ExpandableListView点击列表项改变列表项内组件产生混乱的问题

//ExpandableListView的适配器
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
GroupViewHolder gvholder;
if (convertView == null) {
gvholder = new GroupViewHolder();
convertView = LinearLayout.inflate(getBaseContext(),
R.layout.group_layout, null);
gvholder.groupcity = (TextView) convertView
.findViewById(R.id.group_title);
gvholder.groupsize = (TextView) convertView
.findViewById(R.id.groupcap);
gvholder.groupload = (ImageView) convertView
.findViewById(R.id.group_state);
convertView.setTag(gvholder);
} else {
gvholder = (GroupViewHolder) convertView.getTag();
}

// ExpandableListView 的OnGroupClick监听
allcitylists.setOnGroupClickListener(new OnGroupClickListener() {

        @Override
        public boolean onGroupClick(ExpandableListView parent, View v,
                int groupPosition, long id) {
            // TODO Auto-generated method stub
            group_checked[groupPosition] = group_checked[groupPosition] + 1;

            ((BaseExpandableListAdapter) expadapter).notifyDataSetChanged();
            if (groupPosition < 5
                    || groupPosition >= provincelist.size() - 3) {
                ArrayList<MKOLSearchRecord> records = mOffline
                        .searchCity(provincelist.get(groupPosition).get(0));

                if (records != null && records.size() == 1) {
                    cityid =

                    records.get(0).cityID;

                    mOffline.start(cityid);

                    updateView();

                //改变的组件
                    TextView loadtext = (TextView) v
                            .findViewById(R.id.group_loadtitle);
                    loadtext.setVisibility(View.VISIBLE);

                    changeloadtext(loadtext, cityid);

                }

            }
            return false;
        }
    });

    内容比较多,没贴完,但关键的地方都在上面,点击列表项能够把loadtext显示出来,但是上下滑动之后,显示的就不是我刚刚点击的那个列表项的TextView,而是其他列表项的Textview,应该是不能在这里用ViewHolder,但是我也想不出来怎么改变,请各位大神指教指教

4个回答

ljlfcg111
ljlfcg111   2016.09.08 10:20
已采纳

回收机制,你上下滑动之后,最上面的item被回收了,你之前点击的那个group会被刷新,你得保存每个group被点击后的groupposition 和对应的cityid,在适配器刷新之后重新显示出来

ljlfcg111
ljlfcg111 回复qq_33230445: 不是,举个例子吧
接近 2 年之前 回复
qq_33230445
qq_33230445 那就不能用ViewHolder了吗
接近 2 年之前 回复
ljlfcg111
ljlfcg111   2016.09.28 11:14

比如这是adapter的getView
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder = null;
try
{
if (convertView == null)
{
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_obtain_order, null);
viewHolder.tv1 = (TextView) convertView.findViewById(R.id.textview);//随便写的textview
convertView.setTag(viewHolder);

    } else
    {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    configViewData(viewHolder,position);
    //-----------------------看这里-----------------------------------

    //假设你有个数组String[] data = {1,2}里面有两个值.
    //当你点击之后,你这个适配器绑定的数据就得保存起来,例如点击了第二个值,数值改变成了3
    //如果你把绑定的数据data 变成{1,3},那当然没问题,怎么滑动都没有问题
    //如果只是单纯的点击后把textview改变显示的值,不保存到对应position的绑定数据的话,滑动后就会变回原来的

    viewHolder.tv1.setText(data[position]);

    //还有一个问题我以前经常犯,如果根据某个状态设值
    //如果只写了if,表面上加载listview之后是没问题的,当你一上下拉,这个textview就会乱变化了,你可以试一试
    /**
    *错误写法
    *if(state.equals("1")){
    *    viewHolder.tv1.setText("已选择");
    *}
    */

    //想上下拉动显示不会错乱的话,正确写法只要把else也写了就行

    if(state.equals("1")){
        viewHolder.tv1.setText("已选择");
    }else{
        viewHolder.tv1.setText("");
    }       

    //-----------------------看这里------------------------------------
    } catch (Exception e)
    {
        Log.e("error", e.toString());
    }
    return convertView;
}
devmiao
devmiao   Ds   Rxr 2016.09.07 23:02
qq_33230445
qq_33230445 。。。没有我要的
接近 2 年之前 回复
qq_28026283
qq_28026283   2016.09.08 10:14

需要loadtext的setTag试一下呢

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
ExpandableListView加EditText及ListView加EditText item复用解决数据错乱问题
解决item 复用引起的数据错乱问题; 1,当item 中含有EditeText 的时候,进行编辑保存。 2,当需要item 中的文字输入限定金额等,教研的时候出现的addTextChangedListener多次执行
利用ExpandableListViewAdapter 点击父节点,无法进行展开和收缩
主要原因是在父节点界面中,利用了ImageButton,它将焦点读取,所以点击父节点无效果 将ImageButton换成ImageView即可。
ExpandableListView动态编辑 item出现convertView 复用错乱问题
Activity 页面 private int[][] tags = null; private int a; private int b; protected void init() { setContentView(R.layout.activity_tank_list_editor); Intent intent = getIntent();
史上最全selector和shape使用方法 Android ListView 列表项点击之后,保持背景颜色
项目中突然遇到这样的问题,一些消息类的界面,需要使用listview进行显示,正常的需求是刚开始进入消息显示界面的时候,列表项显示的都是全黑的,接着点击了某一个列表项之后,就要更换成白色,并且保持白色的显示,剩下的仍旧为黑色的,一开始就有点走进了死胡同,使用selector结合shape来定义选中、未选中、点击或者点击之后的背景显示,实例如下:
ExpandableListView、ListView EditText 输入数据混乱的问题
如图所示,可以点加号减号修改数量,也可以直接点击进行输入 ExpandableListView、ListView EditText 输入数据混乱的问题,在ExpandableListView和ListView的Item中有EditText输入框的时候,在输入的时候,如果不做处理就会发生混乱,这个问题主要是由复用Item造成的,简单地解决方法就是不复用Item,但这样会带来性能问题,数据量大的时候就
ExpandableListView子item选中颜色发生改变
经常会遇到ExpandableListView这个控件,有的时候会有需求是当下拉列表子item被选中时要进行颜色的改变,以便标识
ExpandableListView 展开childView后,childView及GroupView布局错乱的问题
算是踩过的一个坑吧。期望实现的效果是这样的: 实际的效果确实这样的: 可以看到,上图中标红的部分有明显的空白。因为ExpandableListView每个item有间隔,所以设置“android:dividerHeight”属性。<ExpandableListView android:layout_marginTop="15dp" android:layout
实现ExpandableListView 二级列表,点击二级条目状态的改变
概述顾名思义,ExpandableListView就是可扩展的ListView,主要用于多级列表,适用于购物车、信息查询、部门信息等场景。重要API:expandGroup (int groupPos) ;//在分组列表视图中 展开一组 setSelectedGroup (int groupPosition) ;//设置选择指定的组 setSelectedChild (int groupPositi
Expandablelistview的数据重复问题
解决ExpandableListView数据重复问题
列表项中包含按钮的ListView的点击事件的响应
ListView列表项中可以存在按钮,例如如下图所示。 清单文件:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="lemon.learnandroid" android:versionCod