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




6 Answers

ماتريد

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

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

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

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

ملخص

  • تعيين 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>

custom adapter

ما أريده بسيط ، على الأقل أعتقد أنه سيكون بسيطا. أنا فقط أريد نافذة حيث يوجد 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 >



يمكنك استخدام android:windowSoftInputMode="adjustPan" في AndroidManifest.xml على النحو التالي

 <activity android:name="com.example.SimpleListView"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustPan" >

هذا يجب أن ينتج الإخراج الذي تريده. وثائق الروبوت الرسمية.

اختياريًا ، يمكنك تحديد صيغة النص (إذا كنت تعمل على بعض ميزات الدردشة) لعرض القائمة لديك إذا كنت تريد التمرير تلقائيًا إلى نهاية listview. يمكنك التحقق من android:transcriptMode="normal" أيضًا ومعرفة ما إذا كان ذلك مناسبًا.

إجابة SO ذات صلة. مسؤول الروبوت وثيقة .

<ListView
android:id="@+id/comments"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transcriptMode="alwaysScroll">

يجب أن يحل هذا معظم مشكلاتك ، ربما باستثناء المشكلة الأخيرة (في الصورة) التي لم أختبرها.




أنا فعلا حصلت على نفس السلوك الذي تحتاجه عن طريق إضافة إلى إعلان Activity في بيان android:windowSoftInputMode="adjustResize" وإلى إعلان ListView android:transcriptMode="normal" . لكل من تغييرات لوحة المفاتيح والتوجيه.




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

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

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




فقط تحقق من ذلك: نأمل أن يساعدك هذا ....

لنفترض أنك تعرف متى تغيرت بيانات القائمة ، يمكنك إخبار القائمة يدويًا بالتمرير إلى الأسفل عن طريق تعيين تحديد القائمة على الصف الأخير. شيء من هذا القبيل:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1) ;
        }
    });
}

أو يمكنك أيضًا تجربة هذا .. بالنسبة لي:

ChatAdapter adapter = new ChatAdapter(this);

ListView lview = (ListView) findViewById(R.id.chatList);
lview .setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lview .setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});



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

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

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

    ....

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




Related