我有一个应用程序,我使用sqlite作为我的数据库,它具有登录和注册。并且用户还可以查看所有帐户。在我的视图类中,我使用了一个片段但是我收到一条错误,上面写着“错误:(58,55)错误:不兼容的类型:_6_ViewAll无法转换为上下文”,在此行中
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();
}
}
谢谢!
答案 0 :(得分: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());
}
}
公平地警告说,目前这两种方法都需要调用。
答案 1 :(得分: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();
}
}
我已经编辑了您的课程以使用正确的上下文。但是请注意,如果您愿意,也可以获得应用程序级别上下文,当您执行与活动没有直接关系的内容时,这会派上用场。