2015-03-11 14 views
8

Sto utilizzando un RecyclerView per visualizzare l'elemento dell'elenco dei miei cassetti nel mio Navigation Drawer. OnClick della voce dell'elenco dei cassetti, sono in grado di aprire diverse attività, tuttavia vorrei poter aprire i frammenti che sostituiranno il layout dell'attività principale.come aprire un altro frammento su recyclerview OnClick

C'è un modo per farlo?

public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder> { 
    private LayoutInflater inflater; 
    private Context context; 
    List<Information> data = Collections.emptyList(); 

    public AdapterClass(Context context, List<Information> data) { 
     this.context = context; 

     inflater = LayoutInflater.from(context); 
     this.data = data; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.custom_row, parent, false); 
     MyViewHolder holder = new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Information current = data.get(position); 
     holder.title.setText(current.title); 
     holder.icon.setImageResource(current.iconId); 

    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     TextView title; 
     ImageView icon; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      context = itemView.getContext(); 
      title = (TextView) itemView.findViewById(R.id.listText); 
      icon = (ImageView) itemView.findViewById(R.id.listIcon); 
      itemView.setClickable(true); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 

      final Intent intent; 
      switch (getPosition()) { 
       case 0: 
        intent = new Intent(context, next.class); 
        break; 

       case 1: 
        intent = new Intent(context, next.class); 
        break; 

       case 2: 
        intent = new Intent(context, next.class); 
        break; 
       default: 
        intent = new Intent(context, next.class); 
        break; 
      } 
      context.startActivity(intent); 
     } 
    } 
}; 

MainActivity.java

public class MainActivity extends ActionBarActivity { 

    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     toolbar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) 
       getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
     drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

NavigationDrawerFragment.java

public class NavigationDrawerFragment extends Fragment { 
    private ActionBarDrawerToggle mDrawerToggle; 
    private DrawerLayout mDrawerLayout; 
    private boolean mUserLearnedDrawer; 
    private boolean mFromSavedInstanceState; 
    public static final String PREF_FILE_NAME = "testpref"; 
    public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer"; 
    private View containerView; 
    private AdapterClass adapter; 
    private RecyclerView recyclerView; 

    public NavigationDrawerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false")); 
     if (savedInstanceState != null) { 
      mFromSavedInstanceState = true; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); 
     recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList); 

     adapter = new AdapterClass(getActivity(), getData()); 
     recyclerView.setAdapter(adapter); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     return layout; 
    } 

    public static List<Information> getData() { 
     List<Information> data = new ArrayList<>(); 
     int[] icons = {R.drawable.ic_menu_check, R.drawable.ic_menu_check, R.drawable.ic_menu_check, R.drawable.ic_menu_check}; 
     String[] titles = {"My Cart", "Lotion", "Deodorants", "Gels"}; 

     for (int i = 0; i < titles.length && i < icons.length; i++) { 
      Information current = new Information(); 
      current.iconId = icons[i]; 
      current.title = titles[i]; 
      data.add(current); 
     } 
     return data; 
    } 

    public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) { 
     containerView = getActivity().findViewById(fragmentId); 
     mDrawerLayout = drawerLayout; 
     mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) { 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       if (!mUserLearnedDrawer) { 
        mUserLearnedDrawer = true; 
        saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer + ""); 
       } 

      } 


      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 


      } 

     }; 
     if (!mUserLearnedDrawer && !mFromSavedInstanceState) { 
      mDrawerLayout.openDrawer(containerView); 
     } 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     mDrawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mDrawerToggle.syncState(); 
      } 
     }); 
    } 


    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    public static void saveToPreferences(Context context, String preferenceName, String preferenceValue) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(preferenceName, preferenceValue); 
     editor.apply(); 
    } 

    public static String readFromPreferences(Context context, String preferenceName, String defaultValue) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE); 
     return sharedPreferences.getString(preferenceName, defaultValue); 
    } 
} 
+0

Sostituire il vostro attuale 'onClick()' logica per iniziare un'attività con corrispondente logica per 'commit()' 'un FragmentTransaction'. Guarda le app di esempio qui: https://github.com/commonsguy/cw-omnibus/tree/master/NavDrawer – CommonsWare

+0

@CommonsWare il tuo esempio sta implementando OnitemclickListener nell'attività principale e lo sto facendo nel mio adattatore. È il stessa cosa fatta in modo diverso? –

+0

Il mio esempio utilizza 'ListView', non' RecyclerView'. La differenza non ha molta importanza. Da qualche parte, hai un metodo che verrà invocato quando l'utente fa clic sulla cosa desiderata. Qui, se vuoi cambiare i frammenti, devi 'commit()' a 'FragmentTransaction'. – CommonsWare

risposta

18

versione semplificata Quindi, ecco la mia onbindVH:

@Override 
    public void onBindViewHolder(FeedsViewHolder holder, int position) { 
     final Feed item = mFeeds.get(position); 

     holder.textView1.setText(item.getText()); 
     holder.imageView.setImageDrawable(mContext.getResources().getDrawable(item.getImage)); 
     holder.imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       fragmentJump(item); 
      } 
     }); 
    } 

ecco fragmentJump:

private void fragmentJump(Feed mItemSelected) { 
    mFragment = new Fragment2(); 
    mBundle = new Bundle(); 
    mBundle.putParcelable("item_selected_key", mItemSelected); 
    mFragment.setArguments(mBundle); 
    switchContent(R.id.frag1, mFragment); 
} 

ecco switchContent sull'adattatore:

public void switchContent(int id, Fragment fragment) { 
    if (mContext == null) 
     return; 
    if (mContext instanceof MainActivity) { 
     MainActivity mainActivity = (MainActivity) mContext; 
     Fragment frag = fragment; 
     mainActivity.switchContent(id, frag); 
    } 

} 

e, infine, ecco la switchContent su MainActivity:

public void switchContent(int id, Fragment fragment) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(id, fragment, fragment.toString()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

so che può ancora essere semplificata, ma funziona così com'è. Spero possa essere d'aiuto. :)

+0

Btw, ho 2 frammentJumps, è per questo che ho separato lo switchContent sull'adattatore. –

+0

Mi piace la tua idea, ora andrò a sistemare la mia app, l'ho lasciata incompiuta. Grazie mille –

+0

non capisco cosa sia mContext ?? @LeiLeyba – Yeahia2508

-3
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder> { 
    private LayoutInflater inflater; 
    private Context context; 
    List<Information> data = Collections.emptyList(); 

    public AdapterClass(Context context, List<Information> data) { 
     this.context = context; 

     inflater = LayoutInflater.from(context); 
     this.data = data; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.custom_row, parent, false); 
     MyViewHolder holder = new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Information current = data.get(position); 
     holder.title.setText(current.title); 
     holder.icon.setImageResource(current.iconId); 

    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     TextView title; 
     ImageView icon; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      context = itemView.getContext(); 
      title = (TextView) itemView.findViewById(R.id.listText); 
      icon = (ImageView) itemView.findViewById(R.id.listIcon); 
      itemView.setClickable(true); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 

      final Intent intent; 
      switch (getPosition()) { 
       case 0: 
        intent = new Intent(context, next.class); 
        break; 

       case 1: 
        intent = new Intent(context, next.class); 
        break; 

       case 2: 
        intent = new Intent(context, next.class); 
        break; 
       default: 
        intent = new Intent(context, next.class); 
        break; 
      } 
      context.startActivity(intent); 
     } 
    } 
}; 
+1

Sebbene questo codice possa rispondere alla domanda, fornendo un contesto aggiuntivo riguardante ** come ** e/o ** perché ** risolve il problema, migliorerebbe il valore a lungo termine della risposta. – Alexander

0

Nel vostro inizio OnBindViewHolder come segue,

@Override 
     public void onClick(View view){ 

      AppCompatActivity activity = (AppCompatActivity) view.getContext(); 
      Fragment myFragment = new MyFragment(); 
      activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit(); 


     } 
Problemi correlati