getTag在ListView中获取错误标记

时间:2014-07-23 06:58:36

标签: android listview android-listview

我有一个列表视图,每个项目都有一个开/关按钮。

加载时,所有用户都关闭。我按下user1,它会打开并将标签设置为“on”。当我向下滚动时,user7打开。在我的日志中,我可以看到user7正在从user1获取标记。向上和向下滚动似乎会继续这种收集错误标签的视图模式。

之前我遇到过listview回收的问题,但只是确保我在getView中正确设置了所有内容。

不幸的是,经过数小时和数小时的故障排除/反复试验后,我还没有解决问题。

非常感谢任何帮助!

这是我的getview。我编号并将用户名添加到日志标记中,以便我可以看到正在调用哪一个用于确定项目1中的标记用于项目7等等:

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        final ViewHolder holder;
        if (convertView == null){

            convertView = inflater.inflate(R.layout.list_item, null);

            holder = new ViewHolder();
            holder.name = (TextView)convertView.findViewById(R.id.name);
            holder.availablebutton = (ImageView)convertView.findViewById(R.id.availablebutton);


            convertView.setTag(holder);

        } else {

            holder = (ViewHolder)convertView.getTag();
        }



        final HashMap<String,String> item = (HashMap<String,String> ) items.get(position);
        if (item != null)
        {

                if (holder.availablebutton.getTag() != null) {

                    Log.d("AB gettag is not null:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));

                    if (("on").equals(holder.availablebutton.getTag().toString())) {
                        holder.availablebutton.setImageResource(R.drawable.on1);
                        Log.d("tag 1:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
                        }
                    else {
                        holder.availablebutton.setImageResource(R.drawable.off1);
                        Log.d("tag 2:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
                    }

                    } else {

                        if ("2".equals(item.get(TAG_AVAILABLE))) {
                            holder.availablebutton.setImageResource(R.drawable.on1);
                            holder.name.setTag("on");
                            Log.d("tag 3:", holder.name.getTag() + item.get(TAG_USERNAME));
                            }
                        else {
                            holder.availablebutton.setImageResource(R.drawable.off1);
                            holder.name.setTag("off");
                            Log.d("tag 4:", holder.name.getTag() + item.get(TAG_USERNAME));
                        }

                       }



            holder.availablebutton.setOnTouchListener(
                    new View.OnTouchListener()
                    {

                        @Override
                        public boolean onTouch(View v, MotionEvent event) {

                    if (holder.availablebutton.getTag() != null) {

                            if (("on").equals(holder.availablebutton.getTag().toString())) {
                                holder.availablebutton.setImageResource(R.drawable.off1);
                                holder.availablebutton.setTag("off");
                                Log.d("button pressed 1:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
                                }
                            else {
                                holder.availablebutton.setImageResource(R.drawable.on1);
                                holder.availablebutton.setTag("on");
                                Log.d("button pressed 2:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
                            }

                    } else {

                        if (("on").equals(holder.name.getTag().toString())) {
                            holder.availablebutton.setImageResource(R.drawable.off1);
                            holder.availablebutton.setTag("off");
                            Log.d("button pressed 3:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
                            }
                        else {
                            holder.availablebutton.setImageResource(R.drawable.on1);
                            holder.availablebutton.setTag("on");
                            Log.d("button pressed 4:", holder.availablebutton.getTag() + item.get(TAG_USERNAME));
                        }

                    }

                            return false;
                        }
                    }
                );

        }

        return convertView;
    }

这是我的logcat,我希望它有道理:

第一次加载:

07-22 23:41:00.948: D/tag 4:(27178): offUser1
07-22 23:41:00.958: D/tag 4:(27178): offUser2
07-22 23:41:00.968: D/tag 4:(27178): offUser3
07-22 23:41:00.978: D/tag 4:(27178): offUser4

按下用户1的按钮:

07-22 23:41:09.148: D/button pressed 4:(27178): onUser1

按下按钮后向下滚动:

07-22 23:41:15.438: D/tag 4:(27178): offUser5
07-22 23:41:15.488: D/tag 4:(27178): offUser6
07-22 23:41:15.518: D/AB gettag is not null:(27178): onUser7
07-22 23:41:15.518: D/tag 1:(27178): onUser7
07-22 23:41:15.548: D/tag 4:(27178): offUser8

1 个答案:

答案 0 :(得分:1)

您无法仅在Tag中保留该值。当视图被回收时,意味着当滚动时视图关闭时,列表视图中将出现完全相同的视图。这就是在getView方法中使用convertView的原因。您可以使用新数据填充此循环视图,但它看起来不错,但您的标记仍然相同。 即使你不回收视图(总是在不使用convertView的情况下充气) - 它仍然无法工作,因为你的标签只是垃圾收集。

您需要做的是例如:创建一个外部哈希集,其中保存所有打开的ID。在getView方法中,您可以检查您的id是否在hashset中,并执行您想要执行的操作。

此外,当您需要的唯一案例是您的列表项目的ON / OFF时 - CHOICE_MODE_MULTIPLE将是一个不错的选择。你需要阅读更多关于它的信息START HERE