修复调用Super的Java类构造函数

时间:2016-05-11 14:47:19

标签: java android

代码适用于android,但问题与Java有关 我有一个派生类我想创建列表并传递给超级构造函数,同时保留子类中的引用

以下代码是我实际想做的事情

public class AccountListAdapter extends ArrayAdapter<Account> {       
    private List<Account> cuentas;
    private Context context;    
    private AccountListStore loginstore;    
    public AccountListAdapter(Context context) {

        loginstore = new AccountListStore(context);
        try {
            cuentas = loginstore.getAccounts();
        } catch (SQLException e) {
            cuentas = new ArrayList<>();
            e.printStackTrace();
        }
        //What I wana but I know is not posible
        super(context, R.layout.acount_listadapter, cuentas);
    }

2 个答案:

答案 0 :(得分:6)

我想@spa的答案已经解决了你的问题。但是有些情况下你需要构造一个超级构造函数参数,但超类不允许你访问那个值。

您可以通过创建一个静态帮助器方法来构造参数值和第二个私有构造函数来解决这个问题,您可以从公共函数中调用它:

public class AccountListAdapter extends ArrayAdapter<Account> {       
    private List<Account> cuentas;
    private Context context;    

    private static List<Account> createCuentas(Context context)
    {
        AccountListStore loginstore = new AccountListStore(context);
        try {
            return loginstore.getAccounts();
        } catch (SQLException e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    public AccountListAdapter(Context context) {
        this(context, createCuentas(context));
    }


    private AccountListAdapter(Context context, List<Account> cuentas) {
        super(context, R.layout.acount_listadapter, cuentas);
        this.cuentas = cuentas;
    }
}

答案 1 :(得分:2)

必须在构造函数中首先调用Super。我会做某事。像这样:

ArrayAdapter

的唯一问题可能cuentas适用于列表的副本。这可能意味着当您调整{{1}}时,它可能不会反映在适配器的支持列表中。