java.lang.ClassCastException:尝试将Activity转换为Fragment

时间:2018-11-23 21:00:10

标签: android android-fragments android-activity casting android-adapter

我正在尝试将Activity转换为Fragment,但我仍想了解如何正确地将其转换为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(); } }

基本上,我正在尝试适应this MainActivity,使其适合底部导航栏,除了在上下文中迷路以外,我还处理以下特定问题:

  

E / Android运行时:致命异常:主要       流程: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.moveToState(FragmentManager.java:1460)           在android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)           在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)           在android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)           在android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)           在android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)           在android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)           在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)           在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:733)           在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)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

     

I / Process:正在发送信号。 PID:5213 SIG:9应用程序终止。

这是我正在处理的代码的副本:

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的位置是否正确)。

按原样编译代码,但是,一旦单击了将调用特定MyHttpsClient到屏幕上的按钮,就会引发错误,并且应用程序立即停止运行。

在此先感谢您的关注和帮助,如果您需要更多有关此问题的信息,请告诉我,以便在此处提供更多信息。

3 个答案:

答案 0 :(得分:1)

您不能将Activity转换为OnNoteItemClick,因为您在片段中实现了它,因此可以将OnNoteItemClick分配给适配器,以便将代码更改为: 适配器:

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'

答案 1 :(得分:0)

替换

notesAdapter = new NotesAdapter(notes, getActivity());

使用

notesAdapter = new NotesAdapter(notes, RoomMarkdownActivity.this);

答案 2 :(得分:0)

感谢Mike M.Reza.Abedini在回答和评论中所说的话,我能够理解正在发生的事情并克服了这个问题。

问题出在Adapter,它准备从Context那里获得Activity,所以我不得不将参数转换为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();
    }

}

非常感谢您的帮助,我希望这个问题/答案也能对其他人有所帮助!