Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 03/10/14, 08:37:34
Avatar de rafaxplayer
rafaxplayer rafaxplayer no está en línea
Miembro del foro
Mensajes: 224
 
Fecha de registro: jun 2013
Localización: en la barcelona media
Mensajes: 224
Modelo de smartphone: LG-E610
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Menu Drawer navigation item dinamico

Saludos compañeros , tengo un problema para actualizar un item deforma dinámica en el nav drawer .
Resulta que despues de cambiar la información del adapter y lanzar notifyDataSetChanged()
desde onResume de la actividad , no se actualiza hasta un segundo onresume, os muestro código haber si veis la falla porque no encuentro el motivo.

Carga del adapter (onCreate de la actividad)

Código:
items = new ArrayList<Object>();

		items.add(new UserProfile("No user",
				"http://www.amsspecialist.com/images/amssp.png"));
		items.add(new Item(getString(R.string.config),
				R.drawable.ic_menu_preferences));
		items.add(new Item(getString(R.string.about),
				R.drawable.ic_menu_info_details));
		items.add(new Item(getString(R.string.exit),
				R.drawable.ic_menu_close_clear_cancel));
		items.add(new Category("Enlaces"));
		items.add(new Item(getString(R.string.forumnavigate),
				R.drawable.ic_action_location_web_site));
		items.add(new Item(getString(R.string.helpams),
				R.drawable.ic_action_action_help));
		items.add(new Item(getString(R.string.youtube),
				R.drawable.ic_action_device_access_video));
		items.add(new Item(getString(R.string.facebook),
				R.drawable.ic_action_face));
		items.add(new Item(getString(R.string.rss), R.drawable.ic_action_rss));
		items.add(new Item(getString(R.string.check_update),
				R.drawable.ic_action_store));

		mAdapter = new MenuAdapter(items);
		mDrawerLayout.setDrawerListener(mDrawerToggle);
		mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
		mDrawerList.setAdapter(mAdapter);
Esto seria el codigo relacionado con el adapter:

Código:
private static class Item {

		String mTitle;
		int mIconRes;

		Item(String title, int iconRes) {
			mTitle = title;
			mIconRes = iconRes;
		}
	}

	private static class UserProfile {

		String mUser;
		String avatarurl;

		UserProfile(String name, String imgAvatarUrl) {
			mUser = name;
			avatarurl = imgAvatarUrl;
		}

	}

	private static class Category {

		String mTitle;

		Category(String title) {
			mTitle = title;
		}
	}

	private class MenuAdapter extends BaseAdapter {

		private List<Object> mItems;

		MenuAdapter(List<Object> items) {
			mItems = items;
		}

		@Override
		public int getCount() {
			return mItems.size();
		}

		@Override
		public Object getItem(int position) {
			return mItems.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public int getItemViewType(int position) {
			return getItem(position) instanceof Item ? 0 : 1;
		}

		@Override
		public int getViewTypeCount() {
			return 3;
		}

		@Override
		public boolean isEnabled(int position) {
			return getItem(position) instanceof Item;
		}

		@Override
		public boolean areAllItemsEnabled() {
			return false;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View v = convertView;
			Object item = getItem(position);
			if (item instanceof UserProfile) {
				if (v == null) {
					v = getLayoutInflater().inflate(R.layout.item_profile_user,
							parent, false);
					ImageView imUser = (ImageView) v
							.findViewById(R.id.imageUserProfile);
					TextView tv = (TextView) v
							.findViewById(R.id.textuserprofile);
					new DownloadImageTask(imUser)
							.execute(((UserProfile) item).avatarurl);
					tv.setText(((UserProfile) item).mUser);
				}
			} else if (item instanceof Category) {
				if (v == null) {
					v = getLayoutInflater().inflate(R.layout.menu_row_category,
							parent, false);
				}

				((TextView) v).setText(((Category) item).mTitle);

			} else {
				if (v == null) {
					v = getLayoutInflater().inflate(R.layout.menu_row_item,
							parent, false);
				}

				TextView tv = (TextView) v;
				tv.setText(((Item) item).mTitle);
				tv.setCompoundDrawablesWithIntrinsicBounds(
						((Item) item).mIconRes, 0, 0, 0);
			}

			// v.setTag(123456, position);

			return v;
		}

	}
Para realizar cambios hay que ir a otra actividad donde se actualiza la info en el preferences y cerrándola después lo que retorna a la principal y on resume se actualiza el item en concreto del menu drawer asi:

Código:
mAdapter.mItems.set(
				0,
				new UserProfile(Settings.getString("username",
						getString(R.string.no_user_login)), Settings.getString(
						"avatarurl",
						"http://www.amsspecialist.com/images/amssp.png")));

		mAdapter.notifyDataSetChanged();
Pues como comento el problema es que no se actualiza en el primer on resume , hay que lanzar un segundo ya sea con un cambio de orientación del dispositivo o lo que sea para que se muestren los cambios ¿cual podria ser el fallo? no doy con ello.
Responder Con Cita


  #2  
Viejo 03/10/14, 10:11:35
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Creo que el problema está en el getView.

Tienes todo el código que actualiza la View dentro del: if (v==null). Ahí dentro sólo debería estar el inflado de la vista, y fuera la asignación de las Views.

Al tenerlo todo dentro cuando actualizas a UserProfile no ocurre nada porque v es distinto de null, cuando cambias la orientación o vas a otra Activity y vuelves se vuelve a crear el ListView y por eso si te actualiza los valores, porque es distinto de null.
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 03/10/14, 16:42:58
Avatar de rafaxplayer
rafaxplayer rafaxplayer no está en línea
Miembro del foro
Mensajes: 224
 
Fecha de registro: jun 2013
Localización: en la barcelona media
Mensajes: 224
Modelo de smartphone: LG-E610
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Vaya! pos si era eso kriogen , gracias por la ayuda , te quiero tío XD
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android

Herramientas

Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 04:02:23 (GMT +2)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007