当前位置: 首页 > 面试题库 >

如何使ArrayAdapter遵循ViewHolder模式?

秦诚
2023-03-14
问题内容

这是我的ArrayAdapter。我想通过遵循ViewHolder模式来提高效率:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

但不确定如何做到这一点。

更新:ViewHolder模式

private class QuoteAdapter extends ArrayAdapter<Quote> {

    private ArrayList<Quote> items;
    // used to keep selected position in ListView
    private int selectedPos = -1; // init value for not-selected

    public QuoteAdapter(Context context, int textViewResourceId, ArrayList<Quote> items) {
        super(context, textViewResourceId, items);
        this.items = items;
    }

    public void setSelectedPosition(int pos) {
        selectedPos = pos;
        // inform the view of this change
        notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ViewHolder holder; // to reference the child views for later actions

        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.mainrow, null);

            // cache view fields into the holder
            holder = new ViewHolder();
            holder.nameText = (TextView) v.findViewById(R.id.nameText);
            holder.priceText = (TextView) v.findViewById(R.id.priceText);
            holder.changeText = (TextView) v.findViewById(R.id.changeText);

            // associate the holder with the view for later lookup
            v.setTag(holder);
        }
        else {
            // view already exists, get the holder instance from the view
            holder = (ViewHolder)v.getTag();
        }

        // change the row color based on selected state
        if (selectedPos == position) {
            v.setBackgroundResource(R.drawable.stocks_selected_gradient);
            holder.nameText.setTextColor(Color.WHITE);
            holder.priceText.setTextColor(Color.WHITE);
            holder.changeText.setTextColor(Color.WHITE);
        } else {
            v.setBackgroundResource(R.drawable.stocks_gradient);
            holder.nameText.setTextAppearance(getApplicationContext(), R.style.BlueText);
            holder.priceText.setTextAppearance(getApplicationContext(), R.style.BlueText);
            holder.changeText.setTextAppearance(getApplicationContext(), R.style.BlueText);
        }

        Quote q = items.get(position);
        if (q != null) {
            if (holder.nameText != null) {
                holder.nameText.setText(q.getSymbol());
            }
            if (holder.priceText != null) {
                holder.priceText.setText(q.getLastTradePriceOnly());
            }
            if (holder.changeText != null) {
                try {
                    float floatedChange = Float.valueOf(q.getChange());
                    if (floatedChange < 0) {
                        if (selectedPos != position)
                            holder.changeText.setTextAppearance(getApplicationContext(), R.style.RedText); // red
                    } else {
                        if (selectedPos != position)
                            holder.changeText.setTextAppearance(getApplicationContext(), R.style.GreenText); // green
                    }
                } catch (NumberFormatException e) {
                    System.out.println("not a number");
                } catch (NullPointerException e) {
                    System.out.println("null number");
                }
                holder.changeText.setText(q.getChange() + " (" + q.getPercentChange() + ")");
            }
        }
        return v;
    }
}

问题答案:

ViewHolder本质上是一个静态类实例,你在创建视图时将其与视图关联,从而在运行时将要查找的子视图缓存起来。如果视图已经存在,请检索holder实例并使用其字段而不是调用findViewById。

在你的情况下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    ViewHolder holder; // to reference the child views for later actions

    if (v == null) {
        LayoutInflater vi = 
            (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.mainrow, null);
        // cache view fields into the holder
        holder = new ViewHolder();
        holder.nameText = (TextView) v.findViewById(R.id.nameText);
        holder.priceText = (TextView) v.findViewById(R.id.priceText);
        holder.changeText = (TextView) v.findViewById(R.id.changeText);
        // associate the holder with the view for later lookup
        v.setTag(holder);
    }
    else {
        // view already exists, get the holder instance from the view
        holder = (ViewHolder) v.getTag();
    }
    // no local variables with findViewById here

    // use holder.nameText where you were 
    // using the local variable nameText before

    return v;
}

// somewhere else in your class definition
static class ViewHolder {
    TextView nameText;
    TextView priceText;
    TextView changeText;
}

警告:我没有尝试编译它.



 类似资料:
  • 我正在考虑这个工厂设计模式的例子,假设我有两个客户端使用这个通知库,在下面的例子中,各个客户端的代码如下所示。 案例1:没有工厂模式 客户端1 客户端2 案例2:使用工厂模式 客户端1 客户端2 所以现在假设通知团队在他们的库中添加了一个新的通知系统,如果假设客户端2想要包含它,那么在情况1中我必须更改具体类名,在情况2中我必须将字符串值更改为新值,所以无论如何,在这两种情况下我都必须进行更改。

  • 问题内容: Python的urllib2遵循3xx重定向以获取最终内容。有没有办法使urllib2(或其他一些库,例如httplib2)也遵循元刷新?还是我需要为刷新meta标签手动解析HTML? 问题答案: 好的,似乎没有库支持它,因此我一直在使用以下代码:

  • 问题内容: 我想在节点中打开一个页面并处理应用程序中的内容。像这样的事情似乎运作良好: 但是,如果页面返回301/302重定向,则此操作无效。万一有多个重定向,我将如何以可重用的方式进行操作?http上方是否有包装器模块,可以更轻松地处理来自节点应用程序的http响应? 问题答案: http上方是否有包装器模块,可以更轻松地处理来自节点应用程序的http响应? 请求中的重定向逻辑

  • 我有一个实现自定义listview的简单代码段。 我的代码如下: 天气适配器。爪哇语: WeatherHolder.java: 我在so和其他网站上看到了这么多答案,我明白了listview的回收机制。 我还了解到,从 viewholder 那里,我们可以将子视图保存在适配器中,而不必多次调用 因此,这是为了优化。 但是我只有和 和< code>getTag在“这里”做什么?

  • 问题内容: 我觉得这里缺少明显的东西! 输出: 当然应该输出: 这是怎么了 问题答案: 字典未排序。如果需要依赖顺序,则需要一个OrderedDict- Python 2.7的模块中有一个,或者您可以使用多种食谱之一。

  • 在阅读了T. Otwell关于Laravel中良好设计模式的书后,我在Laravel 4中创建了一个应用程序,我发现自己为应用程序上的每个表创建了存储库。 我最终得到了以下表格结构: 学生:身份证,姓名 我有用于所有这些表的find、create、update和delete方法的存储库类。每个存储库都有一个与数据库交互的雄辩模型。根据Laravel的文档在模型中定义了关系:http://larav