【问题标题】:Overriding Android ArrayAdapter覆盖 Android ArrayAdapter
【发布时间】:2011-03-03 05:35:55
【问题描述】:

我想做一件非常简单的事情。我的应用程序中有一个列表视图,我动态地向其中添加文本。但是,在某一点之后,我想更改列表视图中文本的颜色。因此,我创建了一个 XML 来定义我的自定义列表项,并将 ArrayAdapter 子类化。但是,每当我在自定义 ArrayAdapter 上调用 add() 方法时,都会将一个项目添加到列表视图中,但不会将文本放入其中。

这是我的 XML:`

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_content" android:textSize="8pt"
    android:gravity="center" android:layout_margin="4dip"
    android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#FF00FF00"/>

还有我的 ArrayAdapter 子类:

private class customAdapter extends ArrayAdapter<String> {
    public View v;
    public customAdapter(Context context){  
        super(context, R.layout.gamelistitem);
    }

    @Override
    public View getView(int pos, View convertView, ViewGroup parent){
        this.v = convertView;
        if(v==null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v=vi.inflate(R.layout.gamelistitem, null);
        }

        if(timeLeft!=0) {
            TextView tv = (TextView)v.findViewById(R.id.list_content);
            //tv.setText(str[pos]);
            tv.setTextColor(Color.GREEN);
        }
        else {
            TextView tv = (TextView)v.findViewById(R.id.list_content);
            //tv.setText(str[pos]);
            tv.setTextColor(Color.RED);
        }

        return v;
    }
}

我确定我做错了什么,但我对 Android 还是有点陌生​​。

谢谢! `

【问题讨论】:

    标签: android listview android-arrayadapter


    【解决方案1】:

    您需要在getView() 中设置文本。用getItem(pos)获取要设置的值,然后设置。

    public View getView(int pos, View convertView, ViewGroup parent){
        this.v = convertView;
        if(v==null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v=vi.inflate(R.layout.gamelistitem, null);
        }
    
        // Moved this outside the if blocks, because we need it regardless
        // of the value of timeLeft.
        TextView tv = (TextView)v.findViewById(R.id.list_content);
        tv.setText(getItem(pos));
    
        if(timeLeft!=0) {
            //TextView tv = (TextView)v.findViewById(R.id.list_content);
            //tv.setText(str[pos]);
            tv.setTextColor(Color.GREEN);
        }
        else {
            //TextView tv = (TextView)v.findViewById(R.id.list_content);
            //tv.setText(str[pos]);
            tv.setTextColor(Color.RED);
        }
    
        return v;
    }
    

    另外,您将v 存储为成员变量,而不仅仅是在函数内部,是否有原因?

    【讨论】:

    • 我存储 v 是因为我认为我可能需要重写 add() 方法,因为我的 ListView 开始时没有任何内容,但随着时间的推移它会获得对象。
    • @Brian515:啊。这是扩展像 ArrayAdapter 这样的全功能类的好处之一。它已经处理了你需要的几乎所有东西(比如add()),你可以只担心自定义数据或自定义视图等奇怪的部分。
    • 我没有机会玩太多 ListView(我刚刚开始),但是根据我对您在做什么以及 ListView 工作原理的理解,我可以看到另一个潜在的问题。据我了解, ListView 回收视图,因此如果您在添加视图时检查 timeLeft 的值,当用户上下滚动时,旧项目可能会从绿色变为红色。如果发生这种情况,或许可以考虑在创建时使用包含 String 和当前 timeLeft 的对象,而不仅仅是 String?
    • @erichamion 是的,我遇到的问题是,一旦 timeLeft 等于 0,所有对象都会变红。我该如何克服这个问题?我可以让 ListView 不回收视图吗?
    • @Brian:我可能会使用一个包含 String 和当前 timeLeft 值的小类。这将需要一个Array&lt;MyClass&gt; 并从ArrayAdapter&lt;MyClass&gt; 扩展,但它只会对getView() 造成微小的更改。如果无法在适配器内计算 timeLeft,则可以添加 add(String) 方法来创建新的 MyClass 对象(使用字符串和当前 timeLeft)并调用 add(MyClass)(仍然不会被覆盖)。这样,您是在添加 data 时录制,而不是在添加 view 时录制。
    猜你喜欢
    • 2011-01-13
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多