Как обновить список навигационного ящика, как только он откроется / закрыт в Android

Я создал навигационный ящик и отображаю элементы в списке. Мой список статичен, но я показываю точки. Поэтому, когда пользователи выбирают элементы в списке и выполняют некоторые действия, он получает очки. Поэтому я хочу обновить очки, как только он появится. Как я могу это сделать./

Ниже мой код:

Класс деятельности:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home_page); // Initializing dataList = new ArrayList<DrawerItem>(); mTitle = mDrawerTitle = getTitle(); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); sharedPreferences = getSharedPreferences(Constant.LOGIN_CHECK, Constant.PRIVATE_MODE); editSharedPreferences = sharedPreferences.edit(); if (sharedPreferences.getBoolean(Constant.IS_ALREADY_LOGIN, false)) { loginInBackground(); } String p1 = sharedPreferences.getString(Constant.USERS_POINTS, ""); String p2 = sharedPreferences.getString( Constant.LEVEL_ONE_POINTS, ""); String p3 = sharedPreferences.getString( Constant.LEVEL_TWO_POINTS, ""); String pointText = " POINTS"; dataList.add(new DrawerItem("OVERVIEW", R.drawable.ic_action_eye, Color.DKGRAY, Color.TRANSPARENT)); dataList.add(new DrawerItem("EARN POINTS", R.drawable.ic_action_dollor, Color.GREEN, Color.TRANSPARENT)); dataList.add(new DrawerItem("MY POINTS ", p1 + pointText, Color.BLACK, Color.BLACK)); dataList.add(new DrawerItem("REFERRALS POINTS LV1 ", p2 + pointText, Color.BLACK, Color.BLACK)); dataList.add(new DrawerItem("REFERRALS POINTS LV2 ", p3 + pointText, Color.BLACK, Color.BLACK)); dataList.add(new DrawerItem("WITHDRAW REWARDS", R.drawable.ic_action_home, Color.DKGRAY, Color.TRANSPARENT)); dataList.add(new DrawerItem("MY PROFILE", R.drawable.ic_action_settings, Color.DKGRAY, Color.TRANSPARENT)); dataList.add(new DrawerItem("HELP", R.drawable.help_d, Color.DKGRAY, Color.TRANSPARENT)); adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item, dataList); mDrawerList.setAdapter(adapter); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); // creates call to // onPrepareOptionsMenu() } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); // creates call to // onPrepareOptionsMenu() } }; mDrawerLayout.setDrawerListener(mDrawerToggle); if (savedInstanceState == null) { SelectItem(0); } } @Override public boolean onCreateOptionsMenu(Menu menu) { String pointsLeft = sharedPreferences.getString( Constant.POINTS_LEFT, ""); getMenuInflater().inflate(R.menu.main, menu); this.menu = menu; MenuItem pointsMenu = menu.findItem(R.id.action_settings); pointsMenu.setTitle(pointsLeft + " Points"); return true; } public void SelectItem(int possition) { Fragment fragment = null; Bundle args = new Bundle(); switch (possition) { case 0: fragment = new FragmentWelcome(); args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition) .getItemName()); args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); fragment.setArguments(args); FragmentManager frgManager0 = getFragmentManager(); frgManager0.beginTransaction() .replace(R.id.content_frame, fragment).commit(); break; case 1: fragment = new FragmentAppList(); args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition) .getItemName()); args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); fragment.setArguments(args); FragmentManager frgManager1 = getFragmentManager(); frgManager1.beginTransaction() .replace(R.id.content_frame, fragment).commit(); break; case 5: fragment = new FragmentRedeemPoints(); args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition) .getItemName()); args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); fragment.setArguments(args); FragmentManager frgManager2 = getFragmentManager(); frgManager2.beginTransaction() .replace(R.id.content_frame, fragment).commit(); break; case 6: fragment = new SettingsFragment(); args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition) .getItemName()); args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); fragment.setArguments(args); FragmentManager frgManager6 = getFragmentManager(); frgManager6.beginTransaction() .replace(R.id.content_frame, fragment).commit(); break; case 7: fragment = new HelpFragment(); args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition) .getItemName()); args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); fragment.setArguments(args); FragmentManager frgManager7 = getFragmentManager(); frgManager7.beginTransaction() .replace(R.id.content_frame, fragment).commit(); break; default: break; } mDrawerList.setItemChecked(possition, true); mDrawerLayout.closeDrawer(mDrawerList); } @Override public void setTitle(CharSequence title) { mTitle = title; getActionBar().setTitle(mTitle); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return false; } private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { SelectItem(position); } } 

CustomDrawerAdapter:

 public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> { Context context; List<DrawerItem> drawerItemList; int layoutResID; public CustomDrawerAdapter(Context context, int layoutResourceID, List<DrawerItem> listItems) { super(context, layoutResourceID, listItems); this.context = context; this.drawerItemList = listItems; this.layoutResID = layoutResourceID; } @SuppressWarnings("static-access") @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub DrawerItemHolder drawerHolder; View view = convertView; if (view == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); drawerHolder = new DrawerItemHolder(); view = inflater.inflate(layoutResID, parent, false); drawerHolder.ItemName = (TextView) view .findViewById(R.id.drawer_itemName); drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon); drawerHolder.pointsText = (TextView) view .findViewById(R.id.get_login); drawerHolder.divider = view.findViewById(R.id.dividerView); drawerHolder.itemLayoutColor = (LinearLayout) view .findViewById(R.id.itemLayoutColor); view.setTag(drawerHolder); } else { drawerHolder = (DrawerItemHolder) view.getTag(); } DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position); if (dItem.getPointText() == null) { drawerHolder.icon.setImageDrawable(view.getResources().getDrawable( dItem.getImgResID())); drawerHolder.pointsText.setVisibility(view.GONE); } else { drawerHolder.pointsText.setText(dItem.getPointText()); } drawerHolder.itemLayoutColor.setBackgroundColor(dItem.layoutColorCode); drawerHolder.divider.setBackgroundColor(dItem.colorCode); drawerHolder.ItemName.setText(dItem.getItemName()); return view; } private static class DrawerItemHolder { TextView ItemName; ImageView icon; TextView pointsText; View divider; LinearLayout itemLayoutColor; } } 

Solutions Collecting From Web of "Как обновить список навигационного ящика, как только он откроется / закрыт в Android"

Наконец, я исправил это, используя приведенный ниже код. Это не правильное решение. Но все же я хочу ответить на это, чтобы другие могли получить ссылку из этого. @ User3154663. Возможно, это поможет вам решить вашу проблему:

 @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); if (drawerOpen) { dataList.remove(2); p1 = sharedPreferences.getString(Constant.USERS_POINTS, ""); p2 = sharedPreferences.getString(Constant.LEVEL_ONE_POINTS, ""); p3 = sharedPreferences.getString(Constant.LEVEL_TWO_POINTS, ""); String pointText = " POINTS"; dataList.add(2, new DrawerItem("MY POINTS ", p1 + pointText, Color.BLACK, Color.BLACK)); dataList.remove(3); dataList.add(3, new DrawerItem("REFERRALS POINTS LV1 ", p2 + pointText, Color.BLACK, Color.BLACK)); dataList.remove(4); dataList.add(4, new DrawerItem("REFERRALS POINTS LV2 ", p3 + pointText, Color.BLACK, Color.BLACK)); adapter.notifyDataSetChanged(); mDrawerList.setAdapter(adapter); } return super.onPrepareOptionsMenu(menu); } 

Вызов notifyDatasetChanged () по- прежнему применяется к адаптеру ListView, независимо от родителя ListView . Вам необходимо сбросить адаптер, используя notifyDatasetChanged (), когда ваш ящик открыт и закрыт и обновляет список с помощью setadapter.

Всякий раз, когда вы хотите обновить макет ящика, обновите пользовательский адаптер, вызвав его, adapter.notifyDataSetChanged(); А затем вызовите mDrawerLayout.invalidate();

Убедитесь, что метод getView() внутри вашего адаптера getView() последнее значение точки.

Если вы хотите обновить элементы ящика, когда пользователь выбрал какой-либо элемент в ящике. затем

  1. Вы должны обновить адаптер для списка в onItemClick .
  2. notifydatasetchange() чтобы отразить изменения.

Но если вы хотите, чтобы пользователь выбрал какой-то элемент в списке, то при закрытии ящика после выбора вы хотите обновить список, в этом случае вы

  1. Слушайте закрытие ящика события –

    Public void onDrawerClosed (Просмотреть представление) {

    // обновить адаптер и вызвать уведомление об изменении набора данных.

    }

Эта ссылка объясняет различные события для ящика

Один из способов,

В адаптере listview , отображаемом в drawer , в getView() при создании каждого представления вы можете зарегистрировать прослушиватель, передав представление для обновления. Когда вы получаете очки, проверьте, является ли представление нулевым (может быть, оно не находится на экране), и обновите представление, если нет. 🙂

ОБНОВИТЬ

Если вы хотите обновить свой список на open/close вам может понадобиться что-то вроде этого

Приемник ящика, который содержит следующие обратные вызовы

 onDrawerClosed(View drawerView) onDrawerOpened(View drawerView) onDrawerSlide(View drawerView, float slideOffset) onDrawerStateChanged(int newState) 

На этих обратных вызовах вы вызываете call notifyDataSetChanged для обновления listView

Вы можете вызвать элемент из объекта navigationView.

  navigationView.getMenu().findItem(R.id.navigation_item_tal).setTitle("elTitulo");