listview的不稳定行为(Android)

时间:2013-09-03 10:17:28

标签: android android-listview

在我的listview中,我有一个自定义适配器,我使用TreeMap构建,我定义了getView方法,如下所示。我试图在点击视图的列表视图的certian textview中删除文本,只有那些包含特定字符模式(y @ y)的文本视图才会被删除。但是,如果单击列表视图中的一行,我将在另一行中获得删除效果。

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);



        if (convertView == null) { 
            convertView = inflater.inflate(R.layout.chklistlayout, parent, false); 
        }
        TextView textView = ((TextView) convertView.findViewById(R.id.textView1));
        TextView imageview = ((TextView) convertView.findViewById(R.id.textView2));
        textView.setText(values[position]);
        imageview.setText(mValues[position]);


        String s = mValues[position];
        if (s.contains("y@y")) {
            System.out.println("In if of getview");
            System.out.println(s);
            imageview.setPaintFlags(imageview.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        } else {

        }

        return convertView;
    }
}

我尝试使用持有者模式,使用静态持有者类,但问题似乎仍然存在。有什么指针吗?

1 个答案:

答案 0 :(得分:2)

这个答案是我和穆罕默德·巴巴尔的一半,我们都在评论这个问题时提出了一个非常好的答案:

  

使用else块来处理这个,imageview.setPaintFlags()不要打击

发生了

  

因为convertView。滚动列表时,同一视图   之前使用的是返回getView方法。所以一样   你之前用StrikeThrough绘制的imageView仍然被绘制   用它。所以你必须恢复那个动作。

更重要的是,由于这种回收,通常处理适配器,您必须始终撤消/恢复/重新绘制/更改文本/将图像更改为所有元素,以确保它将以您希望的方式显示在屏幕上。

ps。:现在你应该使用Holder模式来获得更好的性能。