2

我的问题是:为什么,如果我使用 LinearLayout,而不是Object,作为我的AsyncTask( TableWithinExpListTask<Params, Progress, LinearLayout>) 的“结果”,Eclipse 会给我很多错误,例如无法实例化 LinearLayout 类型
在我看来,它不再识别LinearLayout了,createFormattedCell()我不明白为什么。
AsyncTask声明LinearLayout中有黄色下划线,Eclipse 说:类型参数 LinearLayout 隐藏类型 LinearLayout
请有人可以向我解释一下吗?

这是该类的代码:

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TableWithinExpListTask<Params, Progress, LinearLayout> extends AsyncTask<Params, Progress, LinearLayout> {

    private final int TABLE_BORDER = 1;
    private final int TABLE_TEXT_PADDING = 10;


    private Context context = null;
    private String str = null;
    private boolean tableHeader = false;
    private LinearLayout column = null;

    public TableWithinExpListTask(Context context, String str, boolean tableHeader, LinearLayout column) {
        this.context = context;
        this.str = str;
        this.tableHeader = tableHeader;
        this.column = column;
    }

    @Override
    protected LinearLayout doInBackground(Params... arg0) {
        return this.createFormattedCell(this.tableHeader, this.str);
    }

    @Override
    protected void onPostExecute(LinearLayout result) {
        this.column.addView(result);
    }

    private LinearLayout createFormattedCell(boolean tabHeader, String str) {
        // Layout che circonda le textView necessario per disegnare il bordo
        // delle celle
        LinearLayout container = new LinearLayout(this.context);

        container.setPadding(TABLE_BORDER, TABLE_BORDER, 0, 0);
        container.setBackgroundColor(Color.BLACK);

        TextView textView = new TextView(this.context);

        textView.setPadding(TABLE_TEXT_PADDING, TABLE_TEXT_PADDING, TABLE_TEXT_PADDING, TABLE_TEXT_PADDING);
        textView.setBackgroundColor(Color.WHITE);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        textView.setLayoutParams(params);

        if (tabHeader) {
            textView.setTypeface(Typeface.DEFAULT_BOLD);
            textView.setBackgroundColor(this.context.getResources().getColor(R.color.light_grayish_orange));
        }
        textView.setText(str);
        container.addView(textView);

        return container;
    }


}

我看到了关于这个的其他问题,但在这种情况下我并不完全理解这种行为。

4

2 回答 2

5

将泛型参数(尖括号中的内容)附加到您的类的名称是告诉 Java 您希望您的类的用户能够指定所涉及的类型,并且您将这些名称用作“变量名称”对于这些用户选择的类型。例如,参见 ,Map<K,V>其中KV表示 的Map键和值的类型。当您将其列为LinearLayout类型参数时,编译器认为您只是将其用作用户会选择的其他类的占位符,并且它不知道如何构造一个。

您希望您的具体类扩展一个使用泛型的类,但您知道要在其中填写的特定类型,因此您不要将类型参数放在您自己的类上,而只是放在您正在使用的类上. 例如,如果你正在编写一个只将 s 映射到s 的自定义Map类,你会说.StringIntegerpublic class MyMap implements Map<String, Integer>

于 2013-08-08T08:47:53.613 回答
2

将整个代码更改为:

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TableWithinExpListTask extends
        AsyncTask<Void, Void, LinearLayout> {

    private final int TABLE_BORDER = 1;
    private final int TABLE_TEXT_PADDING = 10;

    private Context context = null;
    private String str = null;
    private boolean tableHeader = false;
    private LinearLayout column = null;

    public TableWithinExpListTask(Context context, String str,
            boolean tableHeader, LinearLayout column) {
        this.context = context;
        this.str = str;
        this.tableHeader = tableHeader;
        this.column = column;
    }

    @Override
    protected LinearLayout doInBackground(Void... arg0) {
        return this.createFormattedCell(this.tableHeader, this.str);
    }

    @Override
    protected void onPostExecute(LinearLayout result) {
        this.column.addView(result);
    }

    private LinearLayout createFormattedCell(boolean tabHeader, String str) {
        // Layout che circonda le textView necessario per disegnare il bordo
        // delle celle
        LinearLayout container = new LinearLayout(this.context);

        container.setPadding(TABLE_BORDER, TABLE_BORDER, 0, 0);
        container.setBackgroundColor(Color.BLACK);

        TextView textView = new TextView(this.context);

        textView.setPadding(TABLE_TEXT_PADDING, TABLE_TEXT_PADDING,
                TABLE_TEXT_PADDING, TABLE_TEXT_PADDING);
        textView.setBackgroundColor(Color.WHITE);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        textView.setLayoutParams(params);

        if (tabHeader) {
            textView.setTypeface(Typeface.DEFAULT_BOLD);
            textView.setBackgroundColor(this.context.getResources().getColor(
                    R.color.light_grayish_orange));
        }
        textView.setText(str);
        container.addView(textView);

        return container;
    }

}

我相信您还需要在 Java 泛型方面有所收获。为此,我将开始阅读Oracle 教程

于 2013-08-08T08:40:07.517 回答