Программно добавлять элементы в верхнюю часть прокрутки, но не прокручивать вверх

У меня есть scrollview с дочерним LinearLayout. Я добавляю к нему данные программно. Когда я добавляю данные в верхнюю часть linearlayout, они автоматически прокручиваются до верхнего элемента. Но я хочу что-то вроде: пользователь достигает вершины -> прокручивает вверх, чтобы загрузить предыдущие данные -> добавлять данные в верхнюю часть linearlayout, но не должны получать фокус после завершения добавления, если пользователь прокручивает, а затем только он должен отображаться.

Как этого добиться?


person Mind Android    schedule 14.04.2014    source источник
comment
хммм, я думаю, вам нужно создать представление в соответствии с потребностями после прокрутки вверху, он должен установить контент в этом представлении, или вы можете добавить в родительский вид   -  person Android    schedule 14.04.2014
comment
Привет. Вы нашли для этого решение? В настоящее время я столкнулся с той же проблемой и еще не нашел решения.   -  person Lev    schedule 24.06.2014


Ответы (3)


Я придумал способ, и он работает почти идеально.

У меня есть LinearLayout (llCommunicationsLayout) внутри ScrollView (svCommunications).

Я раздуваю новый LinearLayout, я собираюсь добавить представления в верхнюю часть этого нового LinearLayout, а затем добавить этот новый макет в LinearLayout внутри ScrollView.

Это новый макет:

final LinearLayout wrapperLayout = (LinearLayout) mInflater.inflate(R.layout.empty_layout, null);

Я добавляю свои представления в нулевую позицию этого макета.

wrapperLayout.addView(view, 0);

После того, как все представления добавлены в wrapperLayout, я добавляю wrapperLayout в llCommunicationsLayout (тот, который находится внутри моего ScrollView)

llCommunicationsLayout.addView(wrapperLayout, 0);

После этого я вычисляю их высоту после того, как wrapperLayout отображается на экране (имеет измеримую высоту).

wrapperLayout.post(new Runnable() {

                    @Override
                    public void run() {
                        int wrapperHeight = wrapperLayout.getHeight();

                        int svHeight = svCommunications.getHeight();

                        int scrollHeight = Math.abs(svHeight - wrapperHeight);

                        DisplayMetrics displaymetrics = new DisplayMetrics();
                        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
                        int displayHeight = displaymetrics.heightPixels / 4;


                        svCommunications.scrollTo(0, (scrollHeight + displayHeight));

                    }
                });

Здесь я получаю как только что добавленный макет, так и высоту ScrollView.

Я вычисляю их разницу, складываю 1/4 высоты экрана своего устройства и прокручиваю, вуаля!

Это не идеально, но после добавления макетов он больше не прокручивается в верхнюю часть экрана. Поэкспериментируйте с displayHeight для получения разных результатов.

Надеюсь, это кому-то поможет.

person Lev    schedule 24.06.2014

Вы можете захватить текущее представление, которое находится поверх вашего LinearLayout, затем добавить новый контент в свой LinearLayout, а затем прокрутить назад, чтобы просмотреть, который ранее был сверху. Код будет примерно таким:

public void addViewsOnTop(List<View> views) {
    final View currentViewOnTop = (linearLayout.getChildCount() > 0) ? linearLayout.getChildAt(0) : null;

    // Add Views. Note that views will appear in reverse order
    for(View view : views) {
        linearLayout.addView(view, 0);
    }

    // Scroll back to view which was on top
    if(currentViewOnTop != null) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                scrollView.scrollTo(0, currentViewOnTop.getBottom());
            }
        });
    }
}
person Piotr Wilczek    schedule 02.09.2014

Решено .... Попробуйте это, у меня сработало,

lv_chat.setAdapter (адаптер); lv_chat.setSelection (somePreviousPosition);

person Mind Android    schedule 25.06.2014
comment
Это будет работать в ListView. В моей (я также думаю, что в OP) ситуации мы добавляем представления вручную вместо использования ListView с адаптером. - person Lev; 25.06.2014