android - شرح - حفظ العنصر المرئي الأخير من ListView عند تغيير حجم ListView




setonitemclicklistener (8)

أحتاج هذه الوظيفة أيضا. إليك محاولتي ، ولكنها لا تعمل تمامًا - إن التمرير غير منتظم بعض الشيء (لا ينتهي دائمًا إلى حيث يجب أن يكون) ويتداخل مع الحفاظ على موضع التمرير عند تدوير الشاشة.

@Override
public void onResume() {
    super.onResume();
    getListView().addOnLayoutChangeListener(stickyLastItemHandler);
}

@Override
public void onPause() {
    super.onPause();
    getListView().removeOnLayoutChangeListener(stickyLastItemHandler);
}

View.OnLayoutChangeListener stickyLastItemHandler = new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v,
            int left, int top, int right, int bottom,
            int oldLeft, int oldTop, int oldRight, int oldBottom) {

        final int heightChange = (bottom - top) - (oldBottom - oldTop);
        if (heightChange != 0) {
            ((AbsListView)v).smoothScrollBy(-heightChange, 1000);
        }
    }
};

https://code.i-harness.com

ما أريده بسيط ، على الأقل أعتقد أنه سيكون بسيطا. أنا فقط أريد نافذة حيث يوجد EditText في أسفل الشاشة ، ويتم ملء باقي المساحة مع ListView. لسوء الحظ ، لم تنجح كما كنت أتوقع. ما أريده هو الصورة التالية. هل هناك أي طريقة سهلة للقيام بذلك في XML ، أو يجب أن أكتب بعض الرموز الخاصة لهذا؟

مشكلتي الروبوت المصدر الكود.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
    android:id="@+id/demolist"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
     >
</ListView>
    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:layout_weight="0">
    </EditText>
</LinearLayout >

أعتقد أنك قد ترغب في استخدام AdapterView.getLastVisiblePosition() قبل عرض لوحة المفاتيح.

اثنين من الحلول هنا:

  • على انقر على EditText
  • بفضل OnScrollListener (ووظيفة onScroll الخاصة به) يستمع إلى ListView الخاص بك

ثم استخدم AdapterView.setSelection للانتقال إلى هذا العنصر (أو فهرس - 2 أو فهرس - 3) بعد التركيز EditText.


أنت في حاجة لتحديد وضع التحديد ... ولكن - بطريقة غريبة ، لا أفهم حقا لماذا - تحتاج إلى القيام بذلك مع آخر ()

public void ScrollToLast() {
    yourList.clearFocus();
    yourList.post(new Runnable() {
        @Override
        public void run() {
            yourList.setSelection(items.size() - 1);
        }
    });
}

لذا يمكنك إضافة TextWatcher للنص EditText الخاص بك ويمكنك استدعاء هذه الطريقة هناك ... لذلك سوف تنتقل قائمتك إلى أسفل.


فقط تجاوز طريقة ListView # onSizeChanged (int w، int h، int oldw، int oldh) مثل أدناه: PS: لا يمكن أن يكون ارتفاع ListView الخاص بك 0 في أي وقت ، إذا كان قد 0 ، لا يعمل.

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (getChildCount() == 0) {
        return;
    }
    final int lastVisiblePosition = getLastVisiblePosition();
    int firstVisiblePosition = getFirstVisiblePosition();

    View last = getChildAt(lastVisiblePosition - firstVisiblePosition);
    int top = last.getTop();
    final int newTop = top + (h - oldh);
    Log.d(getClass().getSimpleName(), "onSizeChanged(" + w + ", " + h + ", " + oldw + ", " + oldh + ")");
    if (mFocusSelector == null) {
        mFocusSelector = new FocusSelector();
    }
    post(mFocusSelector.setup(lastVisiblePosition, newTop));
    super.onSizeChanged(w, h, oldw, oldh);
}

private class FocusSelector implements Runnable {
    private int mPosition;
    private int mPositionTop;

    public FocusSelector setup(int position, int top) {
        mPosition = position;
        mPositionTop = top;
        return this;
    }

    public void run() {
        setSelectionFromTop(mPosition, mPositionTop);
    }
}

في ListAdapter الخاص بك ، يمكنك القيام بشيء مثل هذا:

   public View getView(int position, View convertView, ViewGroup parent) {

//buttonMore
if( position >= super.getCount()  )
      return textField ;

    ....

بهذه الطريقة ، ستحصل دائمًا على العنصر الأخير في القائمة كنصك النصي.


لقد قمت بإنشاء محرك تنسيقي لـ Android يسمح لك بالاستماع إلى تغييرات لوحة المفاتيح المرئية والمرئية (من بين العديد من الميزات الأساسية الأخرى). هذه المكتبة متاحة على http://phil-brown.github.io/AbLE/ .

ببساطة ، أضف jar إلى دليل libs (أنشئ هذا المجلد إذا لم يكن موجودًا) ، وبدلاً من أن يرث من Activity ، AbLEActivity من AbLEActivity . بعد ذلك ، تجاوز الطرق على onKeyboardShown onKeyboardHidden ، وفي هذه يمكنك تحريك عرض المحتوى الخاص بك لأعلى أو لأسفل حسب الحاجة:

@Override
public void onKeyboardShown() {
    //animate up
}

@Override
public void onKeyboardHidden() {
    //animate down
}

يمكنك القيام بذلك من خلال xml:

<ListView
    android:stackFromBottom="true"
    android:layout_height=0dp
    android:layout_weight=1 />

التراص من أسفل سيبقي ListView تم التمرير لأسفل بشكل افتراضي ، تعيين الوزن ListView سوف تملأ كل المساحة الممكنة داخل الخط الرأسي LinearLayout.


ماتريد

آخر عنصر مرئي بدون لوحة المفاتيح

آخر عنصر مرئي باستخدام لوحة المفاتيح

آخر عنصر مرئي مع إدخال أكبر

هنا كيف فعلت ذلك.

ملخص

  • تعيين android: stackFromBottom = "true" والروبوت: transcriptMode = "alwaysScroll" في عرض القائمة
  • تعيين android: windowSoftInputMode = "adjustPan" في النشاط
  • استدعاء adapter.notifyDataSetChanged ()؛ عند إضافة دردشات جديدة بحيث يتم تمرير عرض القائمة دائمًا إلى آخر موضع
  • تعيين android: inputType = "textMultiLine" & android: maxLines = "4" في EditText لمربع النص المتزايد

تفاصيل

نشاط

<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"></activity>

عرض الدردشة

<RelativeLayout
    android:id="@+id/chat_header"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:padding="3dp" >

    <Button
        android:id="@+id/btnBackChat"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentLeft="true"
        android:background="@drawable/back_button" />

    <TextView
        android:id="@+id/txt_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btnBackChat"
        android:layout_centerHorizontal="true"
        android:textColor="@android:color/white"
        android:textSize="18sp" />

    <ImageView
        android:id="@+id/imgViewProfileChat"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentRight="true"
        />
</RelativeLayout>

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/form"
    android:layout_below="@+id/chat_header"
    android:stackFromBottom="true"
    android:transcriptMode="alwaysScroll"/>

<RelativeLayout
    android:id="@+id/form"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:orientation="vertical" >

    <ImageButton
        android:id="@+id/btnAttach"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:contentDescription="@string/attach"
        android:src="@drawable/attach_icon" />

    <EditText
        android:id="@+id/txtChat"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btnSend"
        android:layout_toRightOf="@+id/btnAttach"
        android:inputType="textMultiLine"
        android:maxLines="4" />

    <Button
        android:id="@+id/btnSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="@string/send" />
</RelativeLayout>





layout