2017-09-01 21 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所述,片段不會擴展Context類,但片段由直接或間接地顯示的類來擴展或實現Context對象,因此您可以使用getContext()方法,或者您始終可以獲取Activity對象負責用getActivity()方法顯示Fragment對象,並可以訪問Activity的所有公共特性。 –

回答

1

一個Fragment不是Context

對於API級別23及更高您可以使用Fragment.getContext()

否則使用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(); 
} 
} 

我已編輯您的課程以使用正確的上下文。請注意,如果您願意,也可以獲取應用程序級別的上下文,當您正在執行與活動無直接關係的內容時,這會派上用場。