2015-06-28 17 views
9

Próbuję uzyskać następujące funkcje w szufladzie nawigacji, ale nie jestem w stanie jej złamać.Kliknij przycisk nawigacji szuflady, nowy widok listy w szufladzie nawigacji

scenariusz: -

Mam panel nawigacji. Po kliknięciu dowolnego elementu w szufladzie nawigacji potrzebuję widoku listy, aby otworzyć go z wieloma elementami, które można dodatkowo wybrać dla pewnego rodzaju funkcjonalności. Załączam także Obraz, który określi moją potrzebę w odpowiedni sposób. Proszę mieć rodzaj odniesienia do obrazu, aby uzyskać to, czego potrzebuję. navigation drawer with multiple list

Każda pomoc byłaby doceniona ..!

+1

Dlaczego nie chcesz na przykład użyć 'ExpandableListView'? Będzie to najlepsza praktyka dla tego, czego chcesz. – rom4ek

+0

nie wspomniałeś o tym, co nie pękło w twoim scenariuszu? Chcesz listę miast po prawej? lub chcesz rozszerzyć listę menu? Wyjaśnij więcej –

+1

Najgorszym rozwiązaniem byłoby użycie dwóch widoków listy z liniową orientacją układu jako poziomą i widocznością zestawu widoczną i nieobecną zgodnie z wymaganiami.Ale chciałbym zaproponować ci użycie rozwiązania rom4ek. – Chitrang

Odpowiedz

4

jak mam zobaczyć obraz tego, co rozumiem, jest to, że z szufladą kliknij chcesz inną listę pojawiają to po prawej stronie. mam rację ? Jeśli poprawię, następnie , nie jest to możliwe przy użyciu ExpandableListView ponieważ ExpandableListView wygeneruje element poniżej klikniętego elementu.

Jednym z rozwiązań jest to, że Możesz wziąć dwa ListView.

Pierwszy ListView wewnątrz szuflady i drugi na swojej głównej zawartości i tworzyć niestandardowe adapter zarówno dla ListView.

Teraz , gdy użytkownik kliknie element listy szuflad, wybierz, która opcja jest kliknięta na, np. Miasto, MyNews lub cokolwiek innego.

Po zidentyfikowaniu kliknięcia można wypełnić adapter dla drugiego ListView, według którego opcja jest kliknięta przez użytkownika. i zastosować ten adapter do drugiego ListView i powiadomić go.

Kiedy użytkownik kliknie na inny przedmiot z szuflady, stanie się to samo. Ale dane dla drugiego ListView będą się zmieniać.

Mam nadzieję, że rozumiesz, co mówię, i to pomaga.

[aktualizacja]

Ok więc xml shuold wyglądać następująco.

Uwaga: Właśnie piszę o tym szkielet.

<!-- The main content view --> 
<FrameLayout android:id="@+id/content_frame" /> 

<!-- The navigation drawer --> 
<LinearLayout 
    android:layout_gravity="start" 
    android:orientation="horizontal"> 
    <ListView 
     android:layout_weight="1" 
     android:id="@+id/list1"> 
    </ListView> 

    <ListView 
     android:layout_weight="1" 
     android:id="@+id/list2"> 
    </ListView> 
</LinearLayout> 

teraz na boku java. rozważyć zarówno ListView są oznaczone jako listy1 i lista2 i utworzeniu dwóch adapter adapter1 i adapter2.

Producent Element kliknięcie na listy1 i zastosowania logiki jak poniżej ...

list1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int pos, long l) { 

     // now here you can get which option is clicked from list1. 
     // using position and 
     int your_type = pos; 

     adapter2.filderDataAccordingToType(your_type); 
     // create the above method in your second adapter and pass your type like MyNews, City or any other. 
     // and apply the logic of filtering by passing type to your method 
     // your_type could be any data type i have take the integer. 
     // and after filtering data you can notify your adapter. 
     // so when the data of adpater gets changed your secondlistview get refreshed. 
    } 
}); 

to wszystko. Mam nadzieję, że ci to pomoże.

+0

cóż, może to być pomocne. umieść Linear Layour w widoku poziomej listy w szufladzie i zachowaj logikę. jeśli możesz go skorygować, zrób to. aby móc przyjąć twoją odpowiedź. –

+0

Jestem po prostu trochę zagubiony, że chcesz obu listview razem na szufladzie lub jeden listview na szufladzie, a drugi poza szufladą ..? Tak, że mogę poprawnie zaktualizować odpowiedź ... – Moinkhan

+0

Obie na szufladzie. –

3

Możesz skorzystać z samouczka dla programistów aplikacji na Androida pod numerem creating a navigation drawer, ale zamiast korzystać z ListView, wybierasz numer ExpandableListView.

Na przykład w tym samouczku widać, że w pierwszym bloku kodu używają one ListView. Zamiast tego, należy zmienić go na coś takiego:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <ExpandableListView android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent"/> 
</android.support.v4.widget.DrawerLayout> 

Jak wdrożyć adapter ExpandableListView jest dobrze wyjaśnione w this samouczka dostępnych na Android ula. Nie wklejam tutaj ich kodu, ponieważ jest to długi samouczek. Skomentuj poniżej, jeśli masz jakieś pytania.

0

Oto mój kod.

  • Używam widoku recyklera dla elementu podrzędnego.
  • to rozwijanie w dół słów.
  • Używam 2 biblioteki.

    kompilacji 'com.h6ah4i.android.widget.advrecyclerview: advrecyclerview: 0.7.1' kompilacji 'com.wnafee: vector-compat: 1.0.5'

tu jest nawigacja Szuflada Fragment

public class NavigationDrawerFragment extends Fragment implements NavigationDrawerCallbacks { 


private static final String SAVED_STATE_EXPANDABLE_ITEM_MANAGER = "RecyclerViewExpandableItemManager"; 

/** 
* Remember the position of the selected item. 
*/ 
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; 

/** 
* Per the design guidelines, you should show the drawer on launch until the user manually 
* expands it. This shared preference tracks this. 
*/ 
private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned"; 

/** 
* A pointer to the current callbacks instance (the Activity). 
*/ 
private NavigationDrawerCallbacks mCallbacks; 

/** 
* Helper component that ties the action bar to the navigation drawer. 
*/ 
private ActionBarDrawerToggle mActionBarDrawerToggle; 

private DrawerLayout mDrawerLayout; 
private RecyclerView mDrawerList; 
private View mFragmentContainerView; 

private int mCurrentSelectedPosition = -1; 
private boolean mFromSavedInstanceState; 
private boolean mUserLearnedDrawer; 

private Subscription subscription; 

@Inject CategoryService categoryService; 

private MyExpandableItemAdapter expandableItemAdapter; 
private RecyclerView.Adapter wrappedAdapter; 
private RecyclerViewExpandableItemManager expandableItemManager; 
private LinearLayoutManager linearLayoutManager; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    DelhiShopApplication.component().inject(this); 

    // Read in the flag indicating whether or not the user has demonstrated awareness of the 
    // drawer. See PREF_USER_LEARNED_DRAWER for details. 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); 

    if (savedInstanceState != null) { 
     mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); 
     mFromSavedInstanceState = true; 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); 
    mDrawerList = (RecyclerView) view.findViewById(R.id.drawerList); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mDrawerList.setLayoutManager(layoutManager); 
    mDrawerList.setHasFixedSize(true); 

    if (mCurrentSelectedPosition != -1) { 
     selectItem(mCurrentSelectedPosition); 
    } 
    return view; 
} 

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

    final Parcelable eimSavedState = (savedInstanceState != null) ? savedInstanceState.getParcelable(SAVED_STATE_EXPANDABLE_ITEM_MANAGER) : null; 
    expandableItemManager = new RecyclerViewExpandableItemManager(eimSavedState); 


} 

private void setRecyclerView(Category category) { 
    linearLayoutManager = new LinearLayoutManager(getActivity()); 

    final MyExpandableItemAdapter myItemAdapter = new MyExpandableItemAdapter(category); 
    wrappedAdapter = expandableItemManager.createWrappedAdapter(myItemAdapter); 


    final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator(); 

    // Change animations are enabled by default since support-v7-recyclerview v22. 
    // Need to disable them when using animation indicator. 
    animator.setSupportsChangeAnimations(false); 

    mDrawerList.setLayoutManager(linearLayoutManager); 
    mDrawerList.setAdapter(wrappedAdapter); // requires *wrapped* adapter 
    mDrawerList.setItemAnimator(animator); 
    mDrawerList.setHasFixedSize(false); 

    // additional decorations 
    //noinspection StatementWithEmptyBody 

// if (supportsViewElevation()) { // // Lollipop lub nowszy ma funkcję natywnego cienia. ItemShadowDecorator nie jest wymagany. //} else { // mDrawerList.addItemDecoration (new ItemShadowDecorator ((NinePatchDrawable) getResources(). GetDrawable (R.drawable // .material_shadow_z1))); //}

expandableItemManager.attachRecyclerView(mDrawerList); 
} 

private boolean supportsViewElevation() { 
    return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP); 
} 

public boolean isDrawerOpen() { 
    return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView); 
} 

public ActionBarDrawerToggle getActionBarDrawerToggle() { 
    return mActionBarDrawerToggle; 
} 

public DrawerLayout getDrawerLayout() { 
    return mDrawerLayout; 
} 

@Override 
public void onNavigationDrawerItemSelected(int position) { 
    selectItem(position); 
} 

/** 
* Users of this fragment must call this method to set up the navigation drawer interactions. 
* 
* @param fragmentId The android:id of this fragment in its activity's layout. 
* @param drawerLayout The DrawerLayout containing this fragment's UI. 
* @param toolbar  The Toolbar of the activity. 
*/ 
public void setup(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) { 
    mFragmentContainerView = (View) getActivity().findViewById(fragmentId).getParent(); 
    mDrawerLayout = drawerLayout; 

    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.myPrimaryDarkColor)); 

    mActionBarDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string 
      .drawer_open, R.string.drawer_close) { 
     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      if (!isAdded()) { 
       return; 
      } 

      getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      if (!isAdded()) { 
       return; 
      } 
      if (!mUserLearnedDrawer) { 
       mUserLearnedDrawer = true; 
       SharedPreferences sp = PreferenceManager 
         .getDefaultSharedPreferences(getActivity()); 
       sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply(); 
      } 
      getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 
    }; 

    // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, 
    // per the navigation drawer design guidelines. 
    if (!mUserLearnedDrawer && !mFromSavedInstanceState) { 
     mDrawerLayout.openDrawer(mFragmentContainerView); 
    } 

    // Defer code dependent on restoration of previous instance state. 
    mDrawerLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mActionBarDrawerToggle.syncState(); 
     } 
    }); 

    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); 
} 

private void selectItem(int position) { 
    mCurrentSelectedPosition = position; 
    if (mDrawerLayout != null) { 
     mDrawerLayout.closeDrawer(mFragmentContainerView); 
    } 
    if (mCallbacks != null) { 
     mCallbacks.onNavigationDrawerItemSelected(position); 
    } 
    ((NavigationDrawerAdapter) mDrawerList.getAdapter()).selectPosition(position); 
} 

public void openDrawer() { 
    mDrawerLayout.openDrawer(mFragmentContainerView); 
} 

public void closeDrawer() { 
    mDrawerLayout.closeDrawer(mFragmentContainerView); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mCallbacks = (NavigationDrawerCallbacks) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException("Activity must implement NavigationDrawerCallbacks."); 
    } 
} 

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

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); 
    if (expandableItemManager != null) { 
     outState.putParcelable(
       SAVED_STATE_EXPANDABLE_ITEM_MANAGER, 
       expandableItemManager.getSavedState()); 
    } 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Forward the new configuration the drawer toggle component. 
    mActionBarDrawerToggle.onConfigurationChanged(newConfig); 
} 

public void setUserData(String user, String email, Bitmap avatar) { 
    ((TextView) mFragmentContainerView.findViewById(R.id.txtUserEmail)).setText(email); 
    ((TextView) mFragmentContainerView.findViewById(R.id.txtUsername)).setText(user); 
} 

public View getGoogleDrawer() { 
    return mFragmentContainerView.findViewById(R.id.googleDrawer); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    subscription = categoryService.getCategories() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<Category>() { 
       @Override 
       public void call(Category category) { 
        // sadfksdjf 
        expandableItemAdapter = new MyExpandableItemAdapter(category); 
        mDrawerList.setAdapter(expandableItemAdapter); 
        setRecyclerView(category); 
       } 
      }, new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        // slkdfj 
       } 

      }); 
} 


@Override 
public void onPause() { 
    subscription.unsubscribe(); 
    super.onPause(); 
} 

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    if (expandableItemManager != null) { 
     expandableItemManager.release(); 
     expandableItemManager = null; 
    } 
} 

Oto mój rozbudowy Adapter poz

public class MyExpandableItemAdapter 
    extends AbstractExpandableItemAdapter<MyExpandableItemAdapter.MyGroupViewHolder, MyExpandableItemAdapter.MyChildViewHolder> { 
private static final String TAG = "MyExpandableItemAdapter"; 

private Category category; 

public static abstract class MyBaseViewHolder extends AbstractExpandableItemViewHolder { 
    public ViewGroup mContainer; 
    public View mDragHandle; 
    public TextView mTextView; 

    public MyBaseViewHolder(View v) { 
     super(v); 
     mContainer = (ViewGroup) v.findViewById(R.id.container); 
     mDragHandle = v.findViewById(R.id.drag_handle); 
     mTextView = (TextView) v.findViewById(android.R.id.text1); 

     // hide the drag handle 
     mDragHandle.setVisibility(View.GONE); 
    } 
} 

public static class MyGroupViewHolder extends MyBaseViewHolder { 
    public MorphButtonCompat mMorphButton; 

    public MyGroupViewHolder(View v) { 
     super(v); 
     mMorphButton = new MorphButtonCompat(v.findViewById(R.id.indicator)); 
    } 
} 

public static class MyChildViewHolder extends MyBaseViewHolder { 
    public MyChildViewHolder(View v) { 
     super(v); 
    } 
} 

public MyExpandableItemAdapter(Category dataProvider) { 
    category = dataProvider; 

    // ExpandableItemAdapter requires stable ID, and also 
    // have to implement the getGroupItemId()/getChildItemId() methods appropriately. 
    setHasStableIds(true); 
} 

@Override 
public int getGroupCount() { 
    return category.getSubCategorySize(); 
} 

@Override 
public int getChildCount(int groupPosition) { 
    return getGroupCategoryAtPosition(groupPosition).getSubCategorySize(); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return groupPosition * 100 + childPosition; 
} 

@Override 
public int getGroupItemViewType(int groupPosition) { 
    return 0; 
} 

@Override 
public int getChildItemViewType(int groupPosition, int childPosition) { 
    return 0; 
} 

@Override 
public MyGroupViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) { 
    final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    final View v = inflater.inflate(R.layout.list_group_item, parent, false); 
    return new MyGroupViewHolder(v); 
} 

@Override 
public MyChildViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) { 
    final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    final View v = inflater.inflate(R.layout.list_item, parent, false); 
    return new MyChildViewHolder(v); 
} 

@Override 
public void onBindGroupViewHolder(MyGroupViewHolder holder, int groupPosition, int viewType) { 
    // child item 

    final Category groupItem = getGroupCategoryAtPosition(groupPosition); 

    // set text 
    holder.mTextView.setText(groupItem.getCategoryName()); 

    // mark as clickable 
    holder.itemView.setClickable(true); 

    // set background resource (target view ID: container) 
    final int expandState = holder.getExpandStateFlags(); 

    if ((expandState & RecyclerViewExpandableItemManager.STATE_FLAG_IS_UPDATED) != 0) { 
     int bgResId; 
     MorphButton.MorphState indicatorState; 

     if ((expandState & RecyclerViewExpandableItemManager.STATE_FLAG_IS_EXPANDED) != 0) { 
      bgResId = R.drawable.bg_group_item_expanded_state; 
      indicatorState = MorphButton.MorphState.END; 
     } else { 
      bgResId = R.drawable.bg_group_item_normal_state; 
      indicatorState = MorphButton.MorphState.START; 
     } 

     holder.mContainer.setBackgroundResource(bgResId); 

     if (holder.mMorphButton.getState() != indicatorState) { 
      holder.mMorphButton.setState(indicatorState, true); 
     } 
    } 
} 

@Override 
public void onBindChildViewHolder(MyChildViewHolder holder, int groupPosition, int childPosition, int viewType) { 
    // group item 
    final Category childCategory = getChildCategory(groupPosition, childPosition); 
    // set text 
    holder.mTextView.setText(childCategory.getCategoryName()); 

    // set background resource (target view ID: container) 
    int bgResId; 
    bgResId = R.drawable.bg_item_normal_state; 
    holder.mContainer.setBackgroundResource(bgResId); 
} 


@Override 
public boolean onCheckCanExpandOrCollapseGroup(MyGroupViewHolder holder, int groupPosition, int x, int y, boolean expand) { 

    Category groupCategory = getGroupCategoryAtPosition(groupPosition); 

    if (groupCategory.getSubCategorySize() == 0) { 
     return false; 
    } 

    // check is enabled 
    if (!(holder.itemView.isEnabled() && holder.itemView.isClickable())) { 
     return false; 
    } 

    final View containerView = holder.mContainer; 
    final View dragHandleView = holder.mDragHandle; 

    final int offsetX = containerView.getLeft() + (int) (ViewCompat.getTranslationX(containerView) + 0.5f); 
    final int offsetY = containerView.getTop() + (int) (ViewCompat.getTranslationY(containerView) + 0.5f); 

    return !hitTest(dragHandleView, x - offsetX, y - offsetY); 
} 

private Category getGroupCategoryAtPosition(int groupPosition) { 
    return category.getSubCategory().get(groupPosition); 
} 

private Category getChildCategory(int groupPosition, int childPosition) { 
    return getGroupCategoryAtPosition(groupPosition).getSubCategory().get(childPosition); 
} 


public static boolean hitTest(View v, int x, int y) { 
    final int tx = (int) (ViewCompat.getTranslationX(v) + 0.5f); 
    final int ty = (int) (ViewCompat.getTranslationY(v) + 0.5f); 
    final int left = v.getLeft() + tx; 
    final int right = v.getRight() + tx; 
    final int top = v.getTop() + ty; 
    final int bottom = v.getBottom() + ty; 

    return (x >= left) && (x <= right) && (y >= top) && (y <= bottom); 
} 
} 

tutaj jest moja list_group_item.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
style="@style/commonListItemStyle" 
android:layout_width="match_parent" 
android:layout_height="96dp" 
android:layout_marginTop="8dp" 
android:background="#ffffff"> 

<RelativeLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="true" 
    tools:ignore="UselessParent"> 

    <View 
     android:id="@+id/drag_handle" 
     android:layout_width="32dp" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:background="#20000000" 
     tools:ignore="RtlHardcoded" /> 

    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_toRightOf="@id/drag_handle" 
     android:gravity="center" /> 
</RelativeLayout> 

</FrameLayout> 

list_item.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
style="@style/commonListItemStyle" 
android:layout_width="match_parent" 
android:layout_height="64dp" 
android:background="@drawable/bg_swipe_item_neutral"> 

<RelativeLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="true" 
    tools:ignore="UselessParent"> 

    <View 
     android:id="@+id/drag_handle" 
     android:layout_width="32dp" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:background="#20000000" /> 

    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_toRightOf="@id/drag_handle" 
     android:gravity="center" 
     tools:ignore="RtlHardcoded" /> 
</RelativeLayout> 

</FrameLayout> 
Powiązane problemy