Добавить нижний колонтитул в Android TouchListView

Привет, я использую элемент управления TouchListView отсюда: https://github.com/commonsguy/cwac-touchlist и я добавил несколько кнопок для добавления в список в нижнем колонтитуле:

    mFooter = getLayoutInflater().inflate(R.layout.edit_homepage_footer_layout, null);
    mListView = (TouchListView) findViewById(R.id.sectionList);
    mListView.addFooterView(mFooter);

Кажется, все работает нормально, пока я не перетаскиваю элемент в списке, после чего нижний колонтитул сворачивается (я думаю, до высоты одного элемента списка), скрывая добавленные мной кнопки.

Может ли кто-нибудь предложить исправление/обходной путь для этого?


person Rupert Bates    schedule 15.07.2011    source источник
comment
Хм... не пробовал TouchListView с верхними или нижними колонтитулами. Я не очень шокирован тем, что есть проблемы. Если вы можете отредактировать свой вопрос со ссылкой на пример проекта, демонстрирующий проблему, я увижу, есть ли простое решение.   -  person CommonsWare    schedule 15.07.2011
comment
Я не могу комментировать этот вопрос, но просто хотел сказать: Марк Мерфи - я в восторге от вас. Вы всегда готовы помочь людям — я никогда не встречал человека, который внес бы столько вклада в среду разработки, как вы. Я, сэр, приветствую вас. Браво.   -  person Martyn    schedule 15.07.2011
comment
@Martyn: ::blushes:: -- спасибо!   -  person CommonsWare    schedule 15.07.2011


Ответы (1)


Я действительно понял это вскоре после того, как спросил об этом (всегда так...)

Проблема заключается в методах doExpansion() и unExpandViews(), которые изменяли каждый элемент в списке, включая нижний колонтитул. Чтобы исправить это, я создал метод, чтобы проверить, имеем ли мы дело с перетаскиваемым элементом или с нижним колонтитулом:

private boolean isDraggableItem(View view) {
    View dragger = view.findViewById(grabberId);
    return dragger != null;
}

А затем изменил упомянутые методы следующим образом:

private void unExpandViews(boolean deletion) {
    for (int i = 0; ; i++) {
        View v = getChildAt(i);
        if (v == null) {
            if (deletion) {
                // HACK force update of mItemCount
                int position = getFirstVisiblePosition();
                int y = getChildAt(0).getTop();
                setAdapter(getAdapter());
                setSelectionFromTop(position, y);
                // end hack
            }
            layoutChildren(); // force children to be recreated where needed
            v = getChildAt(i);
            if (v == null) {
                break;
            }
        }
        if (isDraggableItem(v)) { //check this view isn't the footer
            ViewGroup.LayoutParams params = v.getLayoutParams();
            params.height = mItemHeightNormal;
            v.setLayoutParams(params);
            v.setVisibility(View.VISIBLE);
        }
    }
}

private void doExpansion() {
    Log.d(logTag, "Doing expansion");
    int childnum = mDragPos - getFirstVisiblePosition();
    if (mDragPos > mFirstDragPos) {
        childnum++;
    }

    View first = getChildAt(mFirstDragPos - getFirstVisiblePosition());

    for (int i = 0; ; i++) {
        View vv = getChildAt(i);
        if (vv == null) {
            break;
        }
        int height = mItemHeightNormal;
        int visibility = View.VISIBLE;
        if (vv.equals(first)) {
            // processing the item that is being dragged
            if (mDragPos == mFirstDragPos) {
                // hovering over the original location
                visibility = View.INVISIBLE;
            } else {
                // not hovering over it
                height = 1;
            }
        } else if (i == childnum) {
            if (mDragPos < getCount() - 1) {
                height = mItemHeightExpanded;
            }
        }
        if (isDraggableItem(vv)) { //check this view isn't the footer
            ViewGroup.LayoutParams params = vv.getLayoutParams();
            params.height = height;
            vv.setLayoutParams(params);
            vv.setVisibility(visibility);
        }
    }
}

Думаю, стоит обновить проект github, чтобы включить это.

person Rupert Bates    schedule 15.07.2011
comment
Да, мне нужно будет что-то сделать. Я посмотрю, смогу ли я придумать более положительный тест, чем отсутствие значка перетаскивания, хотя, если необходимо, не может быть перетаскивания в верхнем / нижнем колонтитуле, это не является необоснованным ограничением. Постараюсь в ближайшее время что-нибудь туда поставить. Большое спасибо! - person CommonsWare; 15.07.2011
comment
Я только что выпустил v0.3.0 проекта, который включает ваши исправления. Я также добавил еще несколько умных функций, чтобы предотвратить сбои, если пользователь попытается перетащить сам нижний колонтитул. Обратите внимание, что это исправление не работает для заголовков — что-то путается в вычислениях строк, поэтому перетаскивание оказывается в неправильном положении. Я постараюсь исправить эту часть вопросов когда-нибудь в будущем. Спасибо за вашу помощь! - person CommonsWare; 21.07.2011
comment
@CommonsWare, мне не нужна поддержка перетаскивания для первых трех элементов списка, это работает для этого? - person Bipin Vayalu; 31.10.2013
comment
@BipinVayalu: я прекратил свой проект несколько месяцев назад, извините. - person CommonsWare; 31.10.2013