Существует несколько деталей интереса при получении свойств системы/среды.
Первый, System.getenv(String)
был представлен way-back-when, затем удержал от использования. Депрекация (по-дурацки, IHMO) продолжалась полностью в JSE 1.4.
Это стало повторно введенным в JSE 5.
Они установлены с помощью панели Environment Variables в Windows. Изменения в переменных не могут быть взяты, пока Ваш текущий VM не является завершением работы, и из экземпляра CMD.exe выходят.
В отличие от свойств среды, Java также имеет системные свойства Java, доступные до System.getProperties()
. Эти переменные могут быть инициализированы, когда VM запускается с помощью серии -Dname=value
параметры командной строки. Например, значения для свойств maxInMemory
и pagingDirectory
установлены в команде ниже:
C:\> java.exe -DmaxInMemory=100M -DpagingDirectory=c:\temp -jar myApp.jar
Эти свойства могут быть изменены во времени выполнения, запретив ограничения политики безопасности.
Я опишу вам, как получить такую проблему, которая у вас есть. Возможно, это вам поможет.
Итак, в адаптере списка у вас есть такой код:
public View getView(int position, View contentView, ViewGroup arg2)
{
ViewHolder holder;
if (contentView == null) {
holder = new ViewHolder();
contentView = inflater.inflate(R.layout.my_magic_list,null);
holder.label = (TextView) contentView.findViewById(R.id.label);
contentView.setTag(holder);
} else {
holder = (ViewHolder) contentView.getTag();
}
holder.label.setText(getLabel());
return contentView;
}
Как видите, мы устанавливаем значение элемента списка только после того, как получили владельца.
Но если вы переместите код в приведенный выше оператор if:
holder.label.setText(getLabel());
, он будет выглядеть, как показано ниже:
if (contentView == null) {
holder = new ViewHolder();
contentView = inflater.inflate(R.layout.my_magic_list,null);
holder.label = (TextView) contentView.findViewById(R.id.label);
holder.label.setText(getLabel());
contentView.setTag(holder);
}
у вас будет текущее поведение приложения с дублированием элементов списка.
Возможно, это поможет.
ListView - хитрый зверь.
Сначала ваш второй вопрос: вы видите дубликаты, потому что ListView повторно использует представления через convertView, но вы не обязательно сбрасываете все аспекты преобразованный вид. Убедитесь, что путь кода для convertView! = Null
правильно устанавливает все данные для представления, и все должно работать правильно.
Вам понадобится getView ()
, чтобы он выглядел примерно так, если вы используете настраиваемые представления:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final MyCustomView v = convertView!=null ? (MyCustomView)convertView : new MyCustomView();
v.setMyData( listAdapter.get(position) );
return v;
}
Если вы не используете собственное представление, просто замените вызов new MyCustomView ()
вызовом ] inflater.inflate (R.layout.my_layout, null)
Что касается вашего первого вопроса, вы захотите посмотреть технический разговор Ромена о производительности ListView здесь: http://code.google. com / events / io / sessions / TurboChargeUiAndroidFast.html
Из его выступления и в порядке важности из моего собственного опыта