Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Мобильные ОС (Android, iOS, Windows Phone)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2012, 15:59   #1
vovik93
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 47
По умолчанию object pool(android)

Кто использовал, помогите разобраться или поделитесь
ссылкой. Мне нужно в пуле хранить много Layout с
четырьмя TextView. Как это реализовать?
vovik93 вне форума Ответить с цитированием
Старый 02.12.2012, 21:45   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от vovik93 Посмотреть сообщение
Кто использовал, помогите разобраться или поделитесь
ссылкой. Мне нужно в пуле хранить много Layout с
четырьмя TextView. Как это реализовать?
Опишите проблему/задачу, т.к. то, что вы сейчас пишите не имеет смысла и обычно не стоит делать при разработке под Android
BOBAH13 вне форума Ответить с цитированием
Старый 02.12.2012, 23:44   #3
vovik93
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Опишите проблему/задачу, т.к. то, что вы сейчас пишите не имеет смысла и обычно не стоит делать при разработке под Android
Задача следующая:
Есть ListView в котором каждый item это день недели
с расписанием уроков на этот день.
---------------------------
Понедельник
---------------------------
№ | нач | занятие | ауд |
1 | 08,00 | химия | 407 |
---------------------------
Вторник
---------------------------
...

Один урок это Layout в котором расположены 4 textView
а так как я не знаю сколько будет уроков в день мне их
нужно создавать динамически, все ок.
Но когда я листаю listView то его item переиспользуется
и если в нем больше строк чем мне нужно то я лишние удаляю
в противном случае добавляю. Это приводит к тому что список
дергается при листании.
vovik93 вне форума Ответить с цитированием
Старый 02.12.2012, 23:45   #4
vovik93
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 47
По умолчанию

Вот сам код
Может что то не так делаю? можно как то по другому?
Код:
public static class ViewHolder
	{
		public TextView tvName;
		public LinearLayout llTable;	
		public LinearLayout llRow;
		public TextView tvNumber;
		public TextView tvBegin;
		public TextView tvScheduleName;
		public TextView tvClassRoom;		
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder view;
		LayoutInflater inflator = activity.getLayoutInflater();

		String name = listDays.get(position).name;
		ArrayList<ListSchedule> listSchedule = listDays.get(position).listSchedule;

		if(convertView==null) {
			view = new ViewHolder();
			convertView = inflator.inflate(R.layout.list_item, null);

			view.tvName = (TextView) convertView.findViewById(R.id.tvName);
			
			view.llTable = (LinearLayout) convertView.findViewById(R.id.llTable);

			int count = 0;
			while (count < listSchedule.size()) {
				view.llRow = new LinearLayout(activity);

				view.tvNumber = new TextView(activity);
				view.llRow.addView(view.tvNumber);

				view.tvBegin = new TextView(activity);
				view.llRow.addView(view.tvBegin);

				view.tvScheduleName = new TextView(activity);
				view.llRow.addView(view.tvScheduleName);

				view.tvClassRoom = new TextView(activity);
				view.llRow.addView(view.tvClassRoom);

				view.llTable.addView(view.llRow);
				count++;
			}
			convertView.setTag(view);	
		}
		else {
			view = (ViewHolder) convertView.getTag();

			if (view.llTable.getChildCount() - 1 > listSchedule.size()) {
				int start = listSchedule.size() + 1;
				int count = view.llTable.getChildCount() - start;
				view.llTable.removeViews(start, count);
			} else 
				if (view.llTable.getChildCount() - 1 < listSchedule.size()) {
					int i = view.llTable.getChildCount();
					while (i < listSchedule.size() + 1) {
						view.llRow = new LinearLayout(activity);

						view.tvNumber = new TextView(activity);
						view.llRow.addView(view.tvNumber);

						view.tvBegin = new TextView(activity);
						view.llRow.addView(view.tvBegin);

						view.tvScheduleName = new TextView(activity);
						view.llRow.addView(view.tvScheduleName);

						view.tvClassRoom = new TextView(activity);
						view.llRow.addView(view.tvClassRoom);

						view.llTable.addView(view.llRow);
						i++;
					}
				}
		}

		view.tvName.setText(name);
		view.tvName.setBackgroundColor(GetColor(position));

		int currentColor;			
		for (int i = 1; i < view.llTable.getChildCount(); i++) {

			if (i % 2 == 0) currentColor = colorWhite;
			else currentColor = colorGray;

			LinearLayout llRow = (LinearLayout)view.llTable.getChildAt(i);

			TextView tvNumber = (TextView) llRow.getChildAt(0);
			tvNumber.setText(String.valueOf(listSchedule.get(i - 1).number));

			params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 2.3f);
			tvNumber.setPadding(10, 10, 10, 10);
			tvNumber.setGravity(Gravity.CENTER);
			tvNumber.setLayoutParams(params);
			tvNumber.setBackgroundColor(currentColor);


			TextView tvBegin = (TextView) llRow.getChildAt(1);
			tvBegin.setText(listSchedule.get(i - 1).begin);
			params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 2.1f);
			tvBegin.setPadding(10, 10, 10, 10);
			params.leftMargin = 2;
			tvBegin.setGravity(Gravity.CENTER);
			tvBegin.setLayoutParams(params);
			tvBegin.setBackgroundColor(currentColor);

			TextView tvScheduleName = (TextView) llRow.getChildAt(2);
			tvScheduleName.setText(listSchedule.get(i - 1).name);
			params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1.3f);
			tvScheduleName.setPadding(10, 10, 10, 10);
			params.leftMargin = 2;
			tvScheduleName.setGravity(Gravity.CENTER);
			tvScheduleName.setLayoutParams(params);
			tvScheduleName.setBackgroundColor(currentColor);


			TextView tvClassRoom = (TextView) llRow.getChildAt(3);
			tvClassRoom.setText(listSchedule.get(i - 1).classroom);
			params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 2.1f);
			tvClassRoom.setPadding(10, 10, 10, 10);
			params.leftMargin = 2;
			tvClassRoom.setGravity(Gravity.CENTER);
			tvClassRoom.setLayoutParams(params);
			tvClassRoom.setBackgroundColor(currentColor);	
		}	
		return convertView;
	}
vovik93 вне форума Ответить с цитированием
Старый 03.12.2012, 22:10   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну код точно не верный. Holder паттерн не для этого сделан. У вас есть Adapter, в адаптере можно указать getviewtypecount и type, т.е. у вас есть же какое то максимальное кол-во возможных уроков. Тогда будет настоящее переиспользование, а сейчас вы по сути ничего не выигрываете, т.к. удаляете или создаете новые View при вызове getView. getView вызов очень чувствительный.
BOBAH13 вне форума Ответить с цитированием
Старый 03.12.2012, 23:20   #6
vovik93
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Ну код точно не верный. Holder паттерн не для этого сделан. У вас есть Adapter, в адаптере можно указать getviewtypecount и type, т.е. у вас есть же какое то максимальное кол-во возможных уроков. Тогда будет настоящее переиспользование, а сейчас вы по сути ничего не выигрываете, т.к. удаляете или создаете новые View при вызове getView. getView вызов очень чувствительный.
А если я не знаю максимальное количество уроков? Может быть 1 а может и 10 и 20. Как тогда поступить?
vovik93 вне форума Ответить с цитированием
Старый 04.12.2012, 02:47   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от vovik93 Посмотреть сообщение
А если я не знаю максимальное количество уроков? Может быть 1 а может и 10 и 20. Как тогда поступить?
Странная задача. Тогда вам не ListView нужен. Если 10 (а если и 20) уроков, то нужен уже отдельный ListView для этого.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при подключении к базе данных Object reference not set to an instance of an object. lowercase ASP.NET 1 20.11.2011 22:48
Object Shyt HTML и CSS 2 21.02.2011 12:04
OBJECT Doholyan Паскаль, Turbo Pascal, PascalABC.NET 14 06.08.2009 19:38