![](/img/trans.png)
[英]java.lang.ClassCastException Adapter cast to an Activity
[英]java.lang.ClassCastException: Activity cannot be cast to Adapter while trying to convert Activity to Fragment
我正在嘗試將Activity
轉換為Fragment
,但我仍想了解如何正確地使用此代碼。
基本上,我正在嘗試修改此MainActivity ,以使其適合底部導航欄,除了在上下文中迷路以外,我還處理以下特定問題:
E / AndroidRuntime:致命例外:主進程:com.example.com,PID:5213 java.lang.ClassCastException:com.example.com.MainActivity無法轉換為com.example.com.adapter.NotesAdapter $ OnNoteItemClick com。 example.com.adapter.NotesAdapter。(NotesAdapter.java:27)位於com.example.com.RoomMarkdownActivity.onCreateView(RoomMarkdownActivity.java:54)位於android.support.v4.app.Fragment.performCreateView(Fragment.java:2439 )在android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460) android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)的moveToState(FragmentManager.java:1852)android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)的moveToState(FragmentManager.java:2625) .v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)在android.support.v4.app.FragmentManagerImpl.rem 在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:733)處的oveRedundantOperationsAndExecute(FragmentManager.java:2366)在android。 os.Handler.handleCallback(Handler.java:873)android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop(Looper.java:193)android.app.ActivityThread.main (ActivityThread.java:6669)在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)在java.lang.reflect.Method.invoke(本機方法)在com.android.internal.os .ZygoteInit.main(ZygoteInit.java:858)
I / Process:正在發送信號。 PID:5213 SIG:9應用程序終止。
這是我正在處理的一段代碼的副本:
public class RoomMarkdownActivity extends Fragment implements NotesAdapter.OnNoteItemClick {
public static RoomMarkdownActivity newInstance() { return new RoomMarkdownActivity(); }
public RecyclerView recyclerView;
public TextView textViewMsg;
public NoteDatabase noteDatabase;
public List<Note> notes;
public NotesAdapter notesAdapter;
public int pos;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.room_markdown_activity, container, false);
textViewMsg = view.findViewById(R.id.textview_empty);
FloatingActionButton fab = view.findViewById(R.id.fab);
fab.setOnClickListener(listener);
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
notes = new ArrayList<>();
notesAdapter = new NotesAdapter(notes, getActivity());
recyclerView.setAdapter(notesAdapter);
noteDatabase = NoteDatabase.getInstance(getActivity());
new RetrieveTask(this).execute();
return view;
}
private static class RetrieveTask extends AsyncTask<Void, Void, List<Note>> {
private WeakReference<RoomMarkdownActivity> activityReference;
RetrieveTask(RoomMarkdownActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected List<Note> doInBackground(Void... voids) {
if (activityReference.get() != null)
return activityReference.get().noteDatabase.getNoteDao().getNotes();
else
return null;
}
@Override
protected void onPostExecute(List<Note> notes) {
if (notes != null && notes.size() > 0) {
activityReference.get().notes.clear();
activityReference.get().notes.addAll(notes);
activityReference.get().textViewMsg.setVisibility(View.GONE);
activityReference.get().notesAdapter.notifyDataSetChanged();
}
}
}
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(getActivity(), RoomMarkdownAddNoteActivity.class), 100);
}
};
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100 && resultCode > 0) {
if (resultCode == 1) {
notes.add((Note) data.getSerializableExtra("note"));
} else if (resultCode == 2) {
notes.set(pos, (Note) data.getSerializableExtra("note"));
}
listVisibility();
}
}
@Override
public void onNoteClick(final int pos) {
new AlertDialog.Builder(recyclerView.getContext())
.setTitle("Select:")
.setItems(new String[]{"Read", "Update", "Delete"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case 0:
RoomMarkdownActivity.this.pos = pos;
startActivityForResult(
new Intent(getActivity(),
RoomMarkdownViewNoteActivity.class).putExtra(
"note", notes.get(pos)), 100);
break;
case 1:
RoomMarkdownActivity.this.pos = pos;
startActivityForResult(
new Intent(getActivity(),
RoomMarkdownAddNoteActivity.class).putExtra(
"note", notes.get(pos)), 100);
break;
case 2:
noteDatabase.getNoteDao().deleteNote(notes.get(pos));
notes.remove(pos);
listVisibility();
break;
}
}
}).show();
}
private void listVisibility() {
int emptyMsgVisibility = View.GONE;
if (notes.size() == 0) {
if (textViewMsg.getVisibility() == View.GONE)
emptyMsgVisibility = View.VISIBLE;
}
textViewMsg.setVisibility(emptyMsgVisibility);
notesAdapter.notifyDataSetChanged();
}
@Override
public void onDestroy() {
noteDatabase.cleanUp();
super.onDestroy();
}
}
這是適配器:
public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.BeanHolder> {
private List<Note> list;
public Context context;
private LayoutInflater layoutInflater;
private OnNoteItemClick onNoteItemClick;
public NotesAdapter(List<Note> list, Context context) {
layoutInflater = LayoutInflater.from(context);
this.list = list;
this.context = context;
this.onNoteItemClick = (OnNoteItemClick) context;
}
@Override
public BeanHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.room_markdown_note_list_item, parent, false);
return new BeanHolder(view);
}
@Override
public void onBindViewHolder(BeanHolder holder, int position) {
Log.e("bind", "onBindViewHolder: " + list.get(position));
holder.textViewTitle.setText(list.get(position).getTitle());
}
@Override
public int getItemCount() {
return list.size();
}
public class BeanHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textViewTitle;
private BeanHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textViewTitle = itemView.findViewById(R.id.textview_title);
}
@Override
public void onClick(View view) {
onNoteItemClick.onNoteClick(getAdapterPosition());
}
}
public interface OnNoteItemClick {
void onNoteClick(int pos);
}
}
似乎在notesAdapter = new NotesAdapter(notes, getActivity());
和this.onNoteItemClick = (OnNoteItemClick) context;
,但我無法找到一個很好的替代getActivity()
我想我在另一種方法解決了這一較早,但是,它仍然拋出另一個類似的錯誤,如果我沒有記錯(該文件是充滿了this
和我不懷疑某些getActivity()
放錯了位置)。
代碼按原樣進行編譯,但是,一旦單擊了將調用特定Fragment
到屏幕的按鈕,就會引發錯誤,並且應用程序立即停止運行。
在此先感謝您的關注和幫助,如果您需要更多有關此問題的信息,請告訴我,以便在此處提供更多信息。
您不能將Activity轉換為OnNoteItemClick,因為您是在片段中實現的,因此可以將OnNoteItemClick分配給適配器,以便將代碼更改為:adapter:
public NotesAdapter(List<Note> list, OnNoteItemClick onNoteItemClick) {
layoutInflater = LayoutInflater.from(context);
this.list = list;
this.context = context;
this.onNoteItemClick = onNoteItemClick;
}
通過以下方式初始化片段中的適配器:
notesAdapter = new NotesAdapter(notes, this); //Your class implements OnNoteItemClick interface so you can use 'this'
更換
notesAdapter = new NotesAdapter(notes, getActivity());
同
notesAdapter = new NotesAdapter(notes, RoomMarkdownActivity.this);
感謝Mike M.和Reza.Abedini在回答和評論中所說的,我能夠理解正在發生的事情並克服了這個問題。
問題出在Adapter
,該Adapter
已准備好從Activity
獲取Context
,因此我不得不將參數轉換為Fragment
,並且最終像這樣工作:
public NotesAdapter(List<Note> list, RoomMarkdownActivity fragment) {
this.layoutInflater = LayoutInflater.from(fragment.getActivity());
this.list = list;
this.fragment = fragment;
this.onNoteItemClick = fragment;
}
和Fragment
一樣:
public class RoomMarkdownActivity extends Fragment implements NotesAdapter.OnNoteItemClick {
public static RoomMarkdownActivity newInstance() {
return new RoomMarkdownActivity();
}
RecyclerView recyclerView;
TextView textViewMsg;
NoteDatabase noteDatabase;
List<Note> notes;
NotesAdapter notesAdapter;
int pos;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.room_markdown_activity, container, false);
textViewMsg = view.findViewById(R.id.textview_empty);
FloatingActionButton fab = view.findViewById(R.id.fab);
fab.setOnClickListener(listener);
recyclerView = view.findViewById(R.id.recycler_view);
initializeViews();
displayList();
return view;
}
private void displayList() {
noteDatabase = NoteDatabase.getInstance(getActivity());
new RetrieveTask(this).execute();
}
private static class RetrieveTask extends AsyncTask<Void, Void, List<Note>> {
private WeakReference<RoomMarkdownActivity> activityReference;
RetrieveTask(RoomMarkdownActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected List<Note> doInBackground(Void... voids) {
if (activityReference.get() != null)
return activityReference.get().noteDatabase.getNoteDao().getNotes();
else
return null;
}
@Override
protected void onPostExecute(List<Note> notes) {
if (notes != null && notes.size() > 0) {
activityReference.get().notes.clear();
activityReference.get().notes.addAll(notes);
activityReference.get().textViewMsg.setVisibility(View.GONE);
activityReference.get().notesAdapter.notifyDataSetChanged();
}
}
}
public void initializeViews() {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
notes = new ArrayList<>();
notesAdapter = new NotesAdapter(notes, this);
recyclerView.setAdapter(notesAdapter);
}
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(getActivity(), RoomMarkdownAddNoteActivity.class), 100);
}
};
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100 && resultCode > 0) {
if (resultCode == 1) {
notes.add((Note) data.getSerializableExtra("note"));
} else if (resultCode == 2) {
notes.set(pos, (Note) data.getSerializableExtra("note"));
}
listVisibility();
}
}
@Override
public void onNoteClick(final int pos) {
new AlertDialog.Builder(getActivity())
.setTitle("Select:")
.setItems(new String[]{"Read", "Update", "Delete"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case 0:
RoomMarkdownActivity.this.pos = pos;
startActivityForResult(
new Intent(getActivity(),
RoomMarkdownViewNoteActivity.class).putExtra(
"note", notes.get(pos)), 100);
break;
case 1:
RoomMarkdownActivity.this.pos = pos;
startActivityForResult(
new Intent(getActivity(),
RoomMarkdownAddNoteActivity.class).putExtra(
"note", notes.get(pos)), 100);
break;
case 2:
noteDatabase.getNoteDao().deleteNote(notes.get(pos));
notes.remove(pos);
listVisibility();
break;
}
}
}).show();
}
public void listVisibility() {
int emptyMsgVisibility = View.GONE;
if (notes.size() == 0) {
if (textViewMsg.getVisibility() == View.GONE)
emptyMsgVisibility = View.VISIBLE;
}
textViewMsg.setVisibility(emptyMsgVisibility);
notesAdapter.notifyDataSetChanged();
}
@Override
public void onDestroy() {
noteDatabase.cleanUp();
super.onDestroy();
}
}
非常感謝您的幫助,希望這個問題/答案也能對其他人有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.