Я разрешаю это путем изменения ListView на RecyclerView, использую RecyclerView .addOnScrollListener для синхронизации события прокрутки. И нет никаких расхождений, это идеально!
private void syncScrollEvent(RecyclerView leftList, RecyclerView rightList) {
leftList.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return rightList.getScrollState() != RecyclerView.SCROLL_STATE_IDLE;
}
});
rightList.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return leftList.getScrollState() != RecyclerView.SCROLL_STATE_IDLE;
}
});
leftList.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
rightList.scrollBy(dx, dy);
}
}
});
rightList.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
leftList.scrollBy(dx, dy);
}
}
});
}
У нас есть собственный исполняемый файл, который запускается после используемых нами сборок.
В наших проектах есть 4 файла конфигурации
web.config - development ( местный ящик)
web.integration.config - альфа-тестирование (выполняется на нашем альфа-сервере)
web.staging.config - бета-тестирование (работает на нашем бета-сервере)
web.production.config - production (работает на нашем производственном сервере)
exe просто удаляет все файлы, кроме необходимого, а затем переименовывает его в web.config ...
Мы не разрешаем не -разработчики (QA, DBA и т. д.) для манипулирования файлами конфигурации, поскольку они могут изменить производственные значения (почтовый сервер, сервер sql) и вызвать некоторые серьезные проблемы ...
Это очень хорошо работает для нас
I'd say do a couple of things:
First, use a staging server. Whether for engineering or non-engineering, have a location where you perform "mock deployments" of your code to the server, and where it's tested from there. This serves a good purpose of giving a distinct "production-like" environment to test from, and it allows for deployment training without causing everybody to go all freaky and shaky from fear of nuking everything on a deployment. It costs a bit more in terms of hardware, but it's probably worth it from the errors that it prevents.
Second, if your configuration files are truly complex and they're hard for non-engineers to construct, create a quick tool that will create your validation files for deployment. A simple website or even client-side app that just takes the basic deployment parameters, does some validation on them, and then saves everything in the right format can do wonders in terms of helping out some of the less-technical folks. The confidence that having a tool that validates your input can be really useful for those types of folks, and knowing that you're always going to have well-formed XML with validated results can save some engineer worry time as well.
Я видел, как компании используют сценарий развертывания и виртуальные машины, которые зеркалируют production, чтобы иметь сборки QA и промежуточные сборки, которые развертываются в них одним нажатием кнопки. Для этого можно использовать Powershell.
Мне всегда удавалось сочетать локальное хранилище настроек и хранилище на основе базы данных. Специфичные для машины настройки хранились в XML-файле на машине (это включало информацию о подключении для нашей корневой базы данных), как и любые настройки для конкретного приложения (но не для конкретного пользователя). В базе данных хранились все настройки пользователя или предприятия, включая информацию о подключении для ДРУГИХ баз данных. Другими словами, у нас была единая база данных с этой информацией, которую клиент мог затем использовать для подключения к другим базам данных. Это позволило нам централизованно поддерживать все, кроме подключения к нашей корневой базе данных.
Предыдущая компания, в которой мы реализовали это:
Все было реализовано с использованием Anthill, NAnt, Robocopy и легкого пользовательского приложения, которое организовывало развертывание. Использование
Самым большим преимуществом этого является то, что у нас почти никогда не было этапа развертывания вручную. Все повторялось и тестировалось, начиная с развертывания разработчиков.
С этой целью мы старались изолировать как можно больше. Мы в основном избегали GAC и machine.configs. Со временем мы обнаружили, что это немного повысило скорость, поскольку все приложения в любом случае не обязательно хотели переходить на новые версии общих компонентов.
Все повторялось и тестировалось, начиная с развертывания разработчиков.С этой целью мы старались изолировать как можно больше. Мы в основном избегали GAC и machine.configs. Со временем мы обнаружили, что это немного повысило скорость, поскольку все приложения в любом случае не обязательно хотели переходить на новые версии общих компонентов.
Все повторялось и тестировалось, начиная с развертывания разработчиков.С этой целью мы старались изолировать как можно больше. Мы в основном избегали GAC и machine.configs. Со временем мы обнаружили, что это немного повысило скорость, поскольку все приложения в любом случае не обязательно хотели переходить на новые версии общих компонентов.