2017-03-29 6 views
1

Fragment의 FragmentAdapter에서 컨텍스트를 캐스팅 할 때 문제가 있습니다. 내 앱 프로세스 : - 탐색 목록 항목 (Nav One)을 클릭하면 recyclerview 및 cardview가있는 조각이 표시됩니다. - cardview 목록 항목의 이미지를 클릭하면 Toast 메시지를 표시하거나 (CustomCallBack) costom 인터페이스를 사용하여 작업을 수행하려고합니다.Fragment의 FragmentAdapter에서 컨텍스트를 캐스팅 할 수 없습니다.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private Toolbar toolbar; 
    private ListView lvNavigation; 
    private DrawerLayout mDrawer; 
    private NavigationView mNavigation; 
    private LinearLayout llMianContain; 
    String[] navigation = new String[]{"Nav One","Nav Two", "Nav Three","Nav Four"}; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     lvNavigation = (ListView) findViewById(R.id.lv_listView); 
     mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mNavigation= (NavigationView) findViewById(R.id.navigation_view); 
     llMianContain = (LinearLayout) findViewById(R.id.ll_main_content); 

     setSupportActionBar(toolbar); 
     lvNavigation.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, navigation)); 
     lvNavigation.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       replaceFragment(i); 
       lvNavigation.setItemChecked(i, true); 
       hideDrawer(); 
      } 
     }); 

     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.open, R.string.close); 
     mDrawer.setDrawerListener(toggle); 
     toggle.syncState(); 
    } 
    private void replaceFragment(int position){ 
     Fragment fragment = null; 
     switch (position){ 
      case 0: 
       fragment = new OneFragment(); 
       break; 
      case 1: 
       fragment = new TwoFragment(); 
       break; 
      case 2: 
       fragment = new ThreeFragment(); 
       break; 
      case 3: 
       fragment= new FourFragment(); 
       break; 
      default: 
       fragment = new OneFragment(); 
       break; 
     } 
     if(null!= fragment){ 
      FragmentManager manager = getSupportFragmentManager(); 
      FragmentTransaction transaction = manager.beginTransaction(); 
      transaction.replace(R.id.ll_main_content, fragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    } 
    private void hideDrawer(){ 
     mDrawer.closeDrawer(GravityCompat.START); 
    } 
    private void showDrawer(){ 
     mDrawer.openDrawer(GravityCompat.START); 
    } 
    @Override 
    public void onBackPressed() { 
     if (mDrawer.isDrawerOpen(GravityCompat.START)) 
      hideDrawer(); 
     else 
      super.onBackPressed(); 
    } 
} 

OneFragment.java

public class OneFragment extends Fragment implements FragmentOneAdapter.CustomCallBack{ 

    private ArrayList<ListItem> listItems; 
    private RecyclerView recyclerView; 
    private FragmentOneAdapter adapter; 

    public OneFragment() { } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view =inflater.inflate(R.layout.fragment_one, container, false); 
     recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
     LinearLayoutManager manager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(manager); 
     listItems = new ArrayList<>(); 
     for(int i=0;i<40;i++){ 
      listItems.add(new ListItem(R.drawable.ic_account_circle_black_48dp, "MY NAME "+ i)); 
     } 
     adapter = new FragmentOneAdapter(listItems, getActivity()); 
     recyclerView.setAdapter(adapter); 
     return view; 
    } 

    @Override 
    public void onProfileClick(int position) { 
     Toast.makeText(getActivity(), "position "+ position, Toast.LENGTH_SHORT).show(); 
    } 
} 

FragmentAdapter.java

public class FragmentOneAdapter extends RecyclerView.Adapter<FragmentOneAdapter.FragmentOneViewHolder> { 

    private ArrayList<ListItem> listItems; 
    private Context context; 
    final CustomCallBack customCallBack; 

    public FragmentOneAdapter(ArrayList<ListItem> listItems, Context context){ 
     this.listItems = listItems; 
     this.context = context; 
     this.customCallBack = (CustomCallBack) context; 
    } 
    @Override 
    public FragmentOneViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_one_item, parent,false); 
     FragmentOneViewHolder holder = new FragmentOneViewHolder(view); 

     return holder; 
    } 
    @Override 
    public void onBindViewHolder(FragmentOneViewHolder holder, int position) { 
     holder.tvName.setText(listItems.get(position).getName()); 
     holder.ivProfile.setImageResource(listItems.get(position).getProfile()); 
    } 
    @Override 
    public int getItemCount() { 
     return listItems.size(); 
    } 
    class FragmentOneViewHolder extends RecyclerView.ViewHolder{ 
     TextView tvName; 
     ImageView ivProfile; 
     LinearLayout llFooter; 

     public FragmentOneViewHolder(View itemView) { 
      super(itemView); 
      tvName = (TextView) itemView.findViewById(R.id.tv_name); 
      ivProfile = (ImageView) itemView.findViewById(R.id.iv_profile); 
      llFooter= (LinearLayout) itemView.findViewById(R.id.ll_footer); 

      ivProfile.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        customCallBack.onProfileClick(getAdapterPosition()); 
       } 
      }); 
     } 
    } 

// MY Custom CallBack 
    interface CustomCallBack{ 
     void onProfileClick(int position); 
    } 
} 

답변

1

흠,

그래서 훌라 : 이 내 코드입니다 사용자 정의 콜백 인터페이스 구현 중

Fragment 객체 자체를 어댑터로 전달하지 않는 이유는 무엇입니까? FragmentOneAdapter.java 예를 들면

,

변화 :

public FragmentOneAdapter(ArrayList<ListItem> listItems, Context context) ===> public FragmentOneAdapter(ArrayList<ListItem> listItems, CustomCallBack callback) 

다음 : OneFragment.java 지금 분명히

this.customCallBack = (CustomCallBack) context; ===> this.customCallBack = callback; 

,

단지 통과 ' Fragment 자체의 매개 변수는 CustomCallBack입니다.

adapter = new FragmentOneAdapter(listItems, getActivity()); ===> adapter = new FragmentOneAdapter(listItems, this); 
+0

이 코드를 따르면 잘 작동합니다. – user7408943

+0

ImageIcon을 클릭 할 때 슬라이드 아래로 애니메이션을 표시하려면 어떻게해야합니까? – user7408943

+0

나는 무엇을하려고하는지 잘 모르겠습니다. 드래그 앤 드롭 애니메이션을 원하십니까? 이 경우 ItemTouchHelper.Callback이 마술을 수행합니다. 이 예제를 보자. https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf 기본적으로, 콜백은 스 와이프 또는 드래그 동작을 처리하고 attachToRecyclerView()를 사용하여 적용한다. 방법. – wysohn