使用视图持有者模式和listview时的setImageResource()

时间:2015-02-12 00:52:40

标签: android

我的listview有一个自定义基础适配器,我使用了视图持有者模式。我必须动态更改几个图像的来源。但是,当我更改其中一个图像后,几个滚动整个图像正在改变。如果我只是删除视图持有人模式一切都很好。

我搜索了一些问题:Facing critical issue: Toggle image source inside Listview using ViewHolder Pattern

但我找不到合适的方法来做到这两点。

这是我的getview()函数。

public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

//        if (convertView == null) {

            holder = new ViewHolder();
            convertView = this.inflater.inflate(R.layout.list_row2, parent, false);

            // For every single item placed on XML
            // Holder must be updated here
            holder.codeName = (TextView) convertView.findViewById(R.id.codeName);
            holder.level = (TextView) convertView.findViewById(R.id.level);
            holder.pt1 = (TextView) convertView.findViewById(R.id.pt1Value);
            holder.pt2 = (TextView) convertView.findViewById(R.id.pt2Value);
            holder.tt3 = (TextView) convertView.findViewById(R.id.tt3Value);
            holder.tt4 = (TextView) convertView.findViewById(R.id.tt4Value);
            holder.lastUpdate = (TextView) convertView.findViewById(R.id.lastUpdate);
            holder.status = (ImageView) convertView.findViewById(R.id.status);
            convertView.setTag(holder);

//        }

//        else {
//            holder = (ViewHolder) convertView.getTag();
//        }



        // Formatting level
        SingleSystem temp = sys.get(position);
        temp.seq1 = temp.seq1.replace("," , ".");
        Float tempLevel = Float.parseFloat(temp.seq1);
        Integer level = Math.round(tempLevel);


        //Check if there is an alert on system
        if(temp.seq13.contains("1") || temp.seq14.contains("1") ||
           temp.seq16.contains("1") || temp.seq30.contains("1") || temp.seq31.contains("1") || temp.seq32.contains("1") ||
           temp.seq45.contains("1")  )
        {
            holder.status.setImageResource(R.drawable.process_warning); //If an alert, change running picture
        }

        //Set background color according to level
        if(level<=15){
            holder.level.setBackgroundColor(Color.rgb(255,17,0));
            holder.status.setImageResource(R.drawable.offline);


        }
        else if(level>15 && level <30){
            holder.level.setBackgroundColor(Color.rgb(255,128,0));

        }
        else{
            holder.level.setBackgroundColor(Color.rgb(66,213,4));
        }

        // Check Time Out
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");

        try {
            Date serverTime = dateFormat.parse(temp.serverTime);
            Date communicationTime = dateFormat.parse(temp.communicationDate);
            long diff = serverTime.getTime() - communicationTime.getTime();
            diff = diff/1000;
            diff = diff/60;
            Integer cOut = Integer.parseInt(temp.communicationTimeOut);
            if(diff > cOut){
                holder.status.setImageResource(R.drawable.offline);
            }

        }
        catch (Exception e){
            e.printStackTrace();
        }

        return convertView;
    }

正如我所说,如果删除if(convertView == null)部分,一切都很好。现在我只有16行,但可能会增加。这将是未来的重大性能问题吗?如何更改我的代码以使用视图持有者模式?

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

视图被重用,即。它们具有之前显示的所有值/颜色/绘图。重新使用视图时,您需要重置图像的可绘制:

else {
    holder = (ViewHolder) convertView.getTag();
    holder.status.setImageDrawable(null);
}