2017-02-01 2 views
0

Ich versuche, eine Fragment innerhalb einer Activity zu laden, und ich konnte die Elemente laden. Nun, was ich tun möchte ist, klicken Sie auf die Elemente in der Liste und übergeben Sie es an die DetailsView.class, die eine Fragment ist, die die Paketdaten erhalten wird. Aber jedes Mal, wenn ich auf den Gegenstand klicke, bekomme ich immer einen Fehler. Unten ist der logcat Fehler, die ichRecyclerView.Adapter onClick ClassCastException

Logcat Fehler

java.lang.ClassCastException: com.test.example.LoadAFragment cannot be cast to com.test.example.MainActivity at com.test.example.controller.DetailsView.onCreateView(DetailsView.java:178) 

Linie java bekommen: 178

MainActivity activity = ((MainActivity) getActivity()); 

LoadAFragment.class

public class LoadAFragment extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.load_layout); 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     MyFragment myFragment = new MyFragment(); 
     fragmentTransaction.add(R.id.frame_container, myFragment); 
     fragmentTransaction.commit(); 
    } 
} 

RecyclerView Adapter

public class MyFragmentAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder> { 

    private List<ListModel> list; 
    private Context mContext = null; 
    private DetailsView detailsView; 

    public MyFragmentAdapter(Context context, List<ListModel> list) { 
     mContext = context; 
     this.list = list; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
     return new MyViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
     final ListModel list = list.get(holder.getAdapterPosition()); 
     String mID = list.getID(); 
     final int id = Integer.valueOf(mID); 
     ((MyViewHolder) holder).title.setText(list.getTitle()); 
     ((MyViewHolder) holder).caption.setText(list.getCaption()); 
     ((MyViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       FragmentManager manager = ((Activity) mContext).getFragmentManager(); 
       FragmentTransaction transaction = manager.beginTransaction(); 
       Bundle bundle = new Bundle(); 
       bundle.putInt("id", id); 
       detailsView = new DetailsView(); 
       detailsView.setTitle(title); 
       detailsView.setArguments(bundle); 
       transaction.replace(R.id.frame_container, detailsView); 
       transaction.addToBackStack("list"); 
       transaction.commit(); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return (list != null? list.size():0); 
    } 

    private class MyViewHolder extends RecyclerView.ViewHolder { 

     public TextView title; 
     public TextView caption; 

     MyViewHolder(View itemView) { 
      super(itemView); 
      title = (TextView) itemView.findViewById(R.id.title); 
      caption = (TextView) itemView.findViewById(R.id.caption); 
     } 
    } 
} 

MyFragment.class

public class MyFragment extends Fragment{ 

    List<ListModel> list; 
    RecyclerView mRecyclerView; 
    MyFragmentAdapter myFragmentAdapter; 
    ListDb listDb; 

    public MyFragment() {} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

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

     View rootView = inflater.inflate(R.layout.fragment, container, false); 

     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 

     listDb = new ListDb(getActivity()); 
     list = listDb.getList(); 
     myFragmentAdapter = new MyFragmentAdapter (getActivity(), list); 
     mRecyclerView.setAdapter(myFragmentAdapter); 

     return rootView; 
    } 
} 

DetailsView.class

public class DetailsView extends Fragment{ 
    private MainActivity activity; 
Bundle b; 

public DetailsView() {} 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState != null) 
      b = savedInstanceState.getBundle("save"); 
     } 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     activity = ((MainActivity) getActivity()); 
     return rootView; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
      super.onViewCreated(view, savedInstanceState);} 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (b != null) { 
      setTitle(b.getString("title")); 
      id = b.getInt("id"); 
     } 
     if (b != this.getArguments().getInt("id")) { 
      b = this.getArguments().getInt("id"); 
      //get data from id 
     } 
    } 
} 
+0

posten Sie Ihre Detailansicht Klassencode – rafsanahmad007

+0

@ rafsanahmad007 I aktualisiert haben der Code – user9123

Antwort

0

Die beste und sauberste Lösung wäre, einen Listener an den Adapter zu übergeben.

public interface MyClickListener { 
    void onResult(Data data); 
} 


public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    public MyAdapter(Context context, MyClickListener listener, List<ListModel> list) { 
     mContext = context; 
     this.list = list; 
     this.listener = listener; 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

     Data data = getData(position); 
     //bind views 

     holder.button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       listener.onResult(data); 
      } 
     }); 

    } 
} 

Lassen Sie das Fragment den Listener implementieren und den neuen Adapter erstellen.

public class MyFragment extends Fragment implements MyClickListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MyAdapter adapter = new MyAdapter(getActivity(),this,listData); 
    } 

    @Override 
    public void onResult(Data data) { 

     //do work after an item is clicked 
    } 

} 
0

Guss getActivity() auf 'LoadAFragment' anstelle von 'MainActivity' in Details .Java. Auf diese Weise:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    activity = ((LoadAFragment) getActivity()); 
    return rootView; 
} 
0

versuchen auf diese Weise Referenz von MainActivity in Ihrem DetailViewFragment

private MainActivity parent_activity; 

@Override 
public void onAttach(Activity activity) 
{ 
    parent_activity = (MainActivity.class.isAssignableFrom(activity 
      .getClass())) ? (MainActivity) activity : null; 
    super.onAttach(activity); 
} 

@Override 
public void onDetach() 
{ 
    parent_activity = null; 
    super.onDetach(); 
} 

verwenden unter Verwendung des Referenz Jetzt zu bekommen:

if(parent_activity!=null) 
{ 
    parent_activity.someMethod(); 
} 
Verwandte Themen