如何在适配器的getView中获取listview的上下文

时间:2013-11-15 23:41:29

标签: android listview fonts layout-inflater typeface

我有三个问题:

  1. 我使用的是getApplicationContext,不像我看过的所有例子都说上下文。我如何获取上下文?或者应用程序上下文是否合适?

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

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

  4. 我的代码:

    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;
        };
    };
    

2 个答案:

答案 0 :(得分:11)

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

ViweGroup父肯定不是null,因此,parent.getContext()可能是获取上下文的最佳方式

答案 1 :(得分:0)

  

我使用的是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中为TextView项目使用ListView分配此字段。

  

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

是的,你应该知道复制/粘贴代码而不理解它总是麻烦。逐行完成并确保您了解一切正在做什么。