2017-09-01 31 views
-2

ログインと登録があるデータベースとしてsqliteを使用したアプリケーションがあります。また、ユーザーはすべてのアカウントを表示できます。私のビュークラスでは、私は、フラグメントを使用するが、私は、「エラー:(58、55)エラー:互換性のない型を:_6_ViewAllは、コンテキストに変換することはできません」というエラーを受け取り、この行では、Android:フラグメントをコンテキストに変換できません

databaseHelper = new DatabaseHelper(_6_ViewAll.this); 

どのようにすることができます私はこれを解決する?ここで

私のソースコードです:

_6_ViewAll.java

public class _6_ViewAll extends Fragment { 

private AppCompatTextView textViewName; 
private RecyclerView recyclerViewUsers; 
private List<UserInfo> listUsers; 
private UsersRecyclerAdapter usersRecyclerAdapter; 
private DatabaseHelper databaseHelper; 

View myView; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 

    myView = inflater.inflate(R.layout.activity__6__view_all, container, false); 

    textViewName = (AppCompatTextView) getView().findViewById(R.id.textViewName); 
    recyclerViewUsers = (RecyclerView) getView().findViewById(R.id.recycleViewUsers); 

    initObjects(); 

    return myView; 
} 

private void initObjects() { 
    listUsers = new ArrayList<>(); 
    usersRecyclerAdapter = new UsersRecyclerAdapter(listUsers); 

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
    recyclerViewUsers.setLayoutManager(mLayoutManager); 
    recyclerViewUsers.setItemAnimator(new DefaultItemAnimator()); 
    recyclerViewUsers.setHasFixedSize(true); 
    recyclerViewUsers.setAdapter(usersRecyclerAdapter); 
    databaseHelper = new DatabaseHelper(_6_ViewAll.this); 

    String emailFromIntent = getActivity().getIntent().getStringExtra("EMAIL"); 
    textViewName.setText(emailFromIntent); 

    getDataFromSQLite(); 
} 

private void getDataFromSQLite() { 
    // AsyncTask is used that SQLite operation not blocks the UI Thread. 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      listUsers.clear(); 
      listUsers.addAll(databaseHelper.getAllUser()); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      usersRecyclerAdapter.notifyDataSetChanged(); 
     } 
    }.execute(); 
} 
} 

ありがとうございました!

+1

databaseHelper = new DatabaseHelper(getContext());うまくいくはずです。 –

+1

'Fragment'クラスは' Context'を拡張しないので、変換できないのですが 'Activity'は' getActivity() 'メソッドを使ってContextを取得します。 –

+1

@VasylGlodanが述べたように、FragmentはContextクラスを拡張しませんが、FragmentはContextオブジェクトを拡張または実装するクラスによって(直接的または間接的に)表示され、getContext()メソッドを使用するか、 GetActivity()メソッドを使用してFragmentオブジェクトを表示し、アクティビティのすべての公開機能にアクセスするActivityオブジェクトです。 –

答えて

1

FragmentあなたがFragment.getContext()を使用できるAPIレベル23以上の場合Context

ではありません。

それ以外の場合はFragment.getActivity()を使用しています。 SQLiteに関連付けられたデータベースクラスを作成しているので、Fragment.getActivity().getApplicationContext()を使用することをお勧めします。

あなたFragmentコード内の例:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if (activity != null && databaseHelper != null) { 
     databaseHelper = new DatabaseHelper(activity.getApplicationContext()); 
    } 
} 

あなたがonAttach(activityの廃止のための準備をしたい場合)も実装しますが、に依存しない:

@TargetApi(Build.VERSION_CODES.M) 
@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    // Calling super.onAttach(context) will also call super.Attach(activty) 
    if (context != null) { 
     databaseHelper = new DatabaseHelper(context.getApplicationContext()); 
    } 
} 

は公正であるが、これはONATTACH両方を呼び出すと警告しました現在の方法です。

0
public class _6_ViewAll extends Fragment { 

private AppCompatTextView textViewName; 
private RecyclerView recyclerViewUsers; 
private List<UserInfo> listUsers; 
private UsersRecyclerAdapter usersRecyclerAdapter; 
private DatabaseHelper databaseHelper; 

View myView; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 

    myView = inflater.inflate(R.layout.activity__6__view_all, container, false); 

    textViewName = (AppCompatTextView) getView().findViewById(R.id.textViewName); 
    recyclerViewUsers = (RecyclerView) getView().findViewById(R.id.recycleViewUsers); 

    initObjects(); 

    return myView; 
} 

private void initObjects() { 
    listUsers = new ArrayList<>(); 
    usersRecyclerAdapter = new UsersRecyclerAdapter(listUsers); 

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
    recyclerViewUsers.setLayoutManager(mLayoutManager); 
    recyclerViewUsers.setItemAnimator(new DefaultItemAnimator()); 
    recyclerViewUsers.setHasFixedSize(true); 
    recyclerViewUsers.setAdapter(usersRecyclerAdapter); 
    databaseHelper = new DatabaseHelper(getContext()/*or use getActivity()*/); 

    String emailFromIntent = getActivity().getIntent().getStringExtra("EMAIL"); 
    textViewName.setText(emailFromIntent); 

    getDataFromSQLite(); 
} 

private void getDataFromSQLite() { 
    // AsyncTask is used that SQLite operation not blocks the UI Thread. 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      listUsers.clear(); 
      listUsers.addAll(databaseHelper.getAllUser()); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      usersRecyclerAdapter.notifyDataSetChanged(); 
     } 
    }.execute(); 
} 
} 

あなたのクラスを編集して、適切なコンテキストを使用しました。ただし、アプリケーションレベルのコンテキストを取得することもできます。これは、アクティビティに直接関係のないものを実行しているときに便利です。

関連する問題