2016-06-29 5 views
0

なしクラスに取り組んでいないが、私はDatabaseAccessクラスからメソッドを呼び出したい、私のクラスである:のgetInstance(この)ここで活動

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { 

List<Person> mItems; 
public Context context; 

private static SQLiteDatabase database; 
private SQLiteOpenHelper openHelper; 

public CardAdapter() { 
    super(); 

    DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this); 
    databaseAccess.open(); 

    List<String> kandidatet = DatabaseAccess.getKandidatet(); 
    database.close(); 

    Person p; 
    mItems = new ArrayList<>(); 
    for (int i = 0; i < kandidatet.size(); i++) { 
     p = new Person(); 
     p.setName(kandidatet.get(i)); 
     mItems.add(p); 
    } 

..... 
.... 
... 
    } 

エラーがこの行にあります。

DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this); 

ここでの方法は、クラスDatabaseAccessである:

private DatabaseAccess(Context context) { 
    this.openHelper = new DatabaseOpenHelper(context); 
} 

それは、コンテキストとして「これを」受け入れない

これを修正するにはどうすればよいですか?

+0

try {getactivity()。getapplicationcontext() –

答えて

2

thisは、オブジェクトがContextクラスまたはその子であることを参照する必要があります。 ActivityContextのサブクラスです。あなたの他のクラスはそうではありません。あなたはその作成時にアダプタオブジェクトにコンテキストを渡すことができますこの問題を回避するには、次の。

public CardAdapter(Context context) { 
    ... 

    DatabaseAccess databaseAccess = DatabaseAccess.getInstance(context); 
+0

コンストラクタの他のすべての呼び出しを混乱させるのでコンストラクタにコンテキストを追加できません –

+0

このアダプタクラスは別のファイルになっていますか、 –

+0

それは別のファイルです –

2

thisはあなたが現在いるクラスを参照しますが、あなたはそれがために活動から必見コールthisをしたい場合有効なcontextアクティビティはContextインターフェイスを実装しているためです。

Activityを拡張しないクラスから呼び出すので、確かにエラーが発生します。その場合、thisContextではないためです。あなたは、フィールドとメソッドを呼び出すことによってこの問題を解決することができcontextあなたは上に宣言した:

DatabaseAccess databaseAccess = DatabaseAccess.getInstance(context); 

あなたがそれを行う前に、あなたはあなたが変更することで行うことができます適切なコンテキスト、このフィールドを初期化する必要があります

public CardAdapter(Context ctx){ 
context = ctx; 
//the rest of the code. 

あなたは断片からそれを呼び出している場合は、アクティビティ(またはgetActivityからそれを呼び出している場合は、今あなたもnew CardAdapter(this)に、コンストラクタの呼び出しを変更する必要があることに注意してください:Contextを受け入れるコンストラクタ)。

+0

他のクラスがあるのでコンストラクタを変更できませんそれを使用します。 –

+0

コンテキストを提供する必要があります。それはセッターを介して行います。そして、このコードをコンストラクタからパブリックメソッドに移行し、setterの後にコールします。いずれか、またはすべての場所でコンストラクタを変更します。または、[Factory design pattern](http://www.tutorialspoint.com/design_pattern/factory_pattern.htm)を使用してください。 – Vucko

+0

私はsetterメソッドで試してみましたが、nullオブジェクトのたびに私に与えます –

関連する問題