2017-02-01 2 views
0

Я пытаюсь загрузить Fragment внутри Activity, и я смог загрузить элементы. Теперь я хочу щелкнуть элементы в списке и передать его в DetailsView.class, который является Fragment, который получит данные пакета. Но каждый раз, когда я нажимаю на элемент, я всегда получаю сообщение об ошибке. Ниже ошибка LogCat, что я получаюRecyclerView.Adapter onClick ClassCastException

Logcat Ошибка

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) 

линия Java: 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 адаптер

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

опубликовать подробный вид кода класса – rafsanahmad007

+0

@ rafsanahmad007 Я обновил код – user9123

ответ

0

Лучшим и самым чистым решением было бы передать слушателю адаптер.

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); 
      } 
     }); 

    } 
} 

Имейте Фрагмент реализовать слушателя и создать новый адаптер.

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

В ролях getActivity() к 'LoadAFragment' вместо '' MainActivity в DetailsView .Ява. Таким образом:

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

попробовать этот способ, чтобы получить Отнесение MainActivity в вашем 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(); 
} 

Теперь используйте ссылку с помощью:

if(parent_activity!=null) 
{ 
    parent_activity.someMethod(); 
} 
Смежные вопросы