【问题标题】:How to get context in getView of adapter for listview如何在列表视图的适配器的 getView 中获取上下文
【发布时间】:2013-11-29 12:36:57
【问题描述】:

我有三个问题:

  1. 我使用 getApplicationContext 与我所见过的所有示例不同,这些示例只是说上下文。我如何在这里获得上下文?还是应用上下文没问题?

  2. 我重写 getView 而不是让它自己处理它是否有任何性能损失(我这样做只是为了设置自定义字体)

  3. 在使用这种方法时我应该注意什么(因为我只是在复制和粘贴,而不知道如果我的列表中有 250 个项目会做什么)。我可能导致的任何潜在泄漏?

我的代码:

private Typeface arabicFont;
arabicFont = Typeface.createFromAsset(getAssets(), "arabicfont.ttf");

...

_arabicAdapter = new SimpleCursorAdapter(this,
                                          R.layout.book_list_item_arabic,
                                          _cursor,
                                          new String[] {"NumberArabic", "Arabic"},
                                          new int[] {R.id.txtNumber, R.id.txtBookName},
                                          CursorAdapter.NO_SELECTION)
{
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if(convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.book_list_item_arabic, parent, false);
        }

        TextView txtBookName = (TextView)convertView.findViewById(R.id.txtBookName);
        txtBookName.setTypeface(arabicFont);

        txtBookName.setText("\"العربية\"");
        return convertView;
    };
};

【问题讨论】:

    标签: android listview fonts layout-inflater typeface


    【解决方案1】:
    public View getView(int position, View convertView, ViewGroup parent)
    

    ViweGroup 的 parent 肯定不为空,所以 parent.getContext() 可能是获取上下文的最佳方式

    【讨论】:

      【解决方案2】:

      我使用 getApplicationContext 与我看到的所有示例不同,这些示例只是说上下文。我如何在这里获得上下文?还是应用上下文没问题?

      您在这里将this 传递给您的构造函数

      _arabicAdapter = new SimpleCursorAdapter(this,
                                            R.layout.book_list_item_arabic,
                                            _cursor,
                                            new String[] {"NumberArabic", "Arabic"},
                                            new int[] {R.id.txtNumber, R.id.txtBookName},
                                            CursorAdapter.NO_SELECTION)
      

      这将是您的Context,因此您应该在您的Adapter 中有一个变量,它是您在构造函数中分配的Context 类型。

      我重写 getView 而不是让它自己处理它是否有任何性能损失(我这样做只是为了设置自定义字体)

      我不知道,但如果它只是一种字体,那么您可以在 style 中为您用于 ListView 项目的 TextView 分配它。

      在使用这种方法时我应该注意什么(因为我只是复制和粘贴,而不了解如果我的列表中有 250 个项目会做什么)。我可能导致的任何潜在泄漏?

      是的,您应该知道,在不理解代码的情况下复制/粘贴代码总是很麻烦。逐行浏览,确保您了解所有内容。

      【讨论】:

      • 上下文似乎不支持 getSystemService() 出于某种原因。说不能静态引用
      • 你做得怎么样?您是否创建了一些变量,例如Context c;,然后将其分配给您在构造函数中传递的上下文,然后执行c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);?
      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多