Buggy ListView让我感到难过

时间:2010-08-12 14:29:54

标签: android listview listviewitem virtual-keyboard

我有一个ListView,我在一个单独的XML文件中定义了每个项目的布局。在此文件中,我添加了RatingBarEditText

我已在此ListView中以编程方式创建了7-8个项目。当我滚动它们时,它似乎是非常错误的。以下是一些例子:

  1. 如果我将焦点设置为第一行中的EditText,然后向下滚动ListView,则其他行中的随机EditTexts将具有焦点。似乎是焦点消失之后的下一个EditText获得焦点。也许这是故意的,但是,作为一个用户,它似乎很奇怪。

  2. 如果我将焦点设置为EditText,接收虚拟键盘,输入内容,然后点击虚拟键盘上的“完成”按钮,EditText将立即清空虚拟键盘消失。

  3. 有时,当我点击EditText,接收虚拟键盘并开始输入字母时,字母会在我输入后立即消失。

  4. 当我点击EditText时,虚拟键盘会显示自己,但EditText失去焦点,我必须再次点击EditText

    < / LI>
  5. 即使我将RatingBar设置为focusable="false",如果我移动我的滚轮,它仍会抓住焦点。

  6. 我的一个问题是当我在虚拟键盘中输入一个字符时,所有可见的列表项都会重新绘制(并且由于EditText的文本被设置为某些数据,这是空的,它会被清除。我不明白为什么Android会在每次输入字符时决定重新绘制列表。

    这是我用来绘制它们的XML。它们是白色气泡,带有灰色边框,还有一些文字,内部有RatingBarEditText

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="10dip"
        android:paddingBottom="10dip"
        android:paddingLeft="15dip"
        android:paddingRight="15dip"
        >
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="2dip"
            android:background="@drawable/shape_outer">
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:padding="2dip"
                android:background="@drawable/shape_inner">
                        <TextView
                                android:id="@+id/rating_category"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:textColor="@color/dark_gray"
                                android:textStyle="bold"
                                android:layout_marginBottom="10dip" />
                            <RatingBar 
                                android:id="@+id/rating_rating"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:numStars="5"
                                android:rating="0"
                                android:stepSize="1"
                                android:focusable="false"
                                android:clickable="false"
                                />
                            <EditText 
                                android:id="@+id/rating_text"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:layout_column="1"
                                android:padding="6dip"
                                android:textColor="#000000"
                                android:gravity="left|top"
                                android:lines="3"
                                android:hint="Comment"
                                android:imeOptions="actionDone" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    

5 个答案:

答案 0 :(得分:19)

听起来ListViews无法很好地处理EditTexts。我做了一些研究,而且共识似乎是“不要这样做”。所以我使用的是创建一个简单的布局文件,它是一个内部包含LinearLayout的ScrollView。在我的onCreate方法中,我将我用于列表项的视图充气并将其添加到LinearLayout。我还将View添加到ArrayList中,以便稍后可以在每个View中保存数据。

这听起来合理吗?

答案 1 :(得分:5)

好吧,将它添加到清单中的活动中......

android:windowSoftInputMode="adjustPan"

示例...

<activity android:name=".mapview.AddParkingLotActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan"/>

答案 2 :(得分:4)

我遇到了同样的问题。当键盘出现时,ListView内部的EditText失去了焦点,所以我从ListView项目中获取了getView

final EditText editInput = (EditText)convertView.findViewById(R.id.edit_input);
editInput.requestFocusFromTouch();

这对我有用。

答案 3 :(得分:3)

这两个步骤解决了我遇到的类似问题(ListView中行上的EditText +有趣的键盘行为)。

  1. android:windowSoftInputMode =&#34; adjustPan&#34; 属性添加到 ListView所在活动的AndroidManifest.xml文件 呈现。
  2. android:descendantFocusability =&#34; afterDescendants&#34; 属性添加到ListView本身。
  3. 这是一个实际的例子:

    的AndroidManifest.xml

        <activity
            android:name=".SubscriptionListActivity"
            android:windowSoftInputMode="adjustPan"
            android:label="@string/title_activity_subscriptions" >
        </activity>
    

    layout.xml文件

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:descendantFocusability="afterDescendants"
            android:id="@+id/subscriptionList" />
    

    我在三星Galaxy S3上进行了测试,它与三星以及SwiftKey键盘配合使用。

答案 4 :(得分:0)

我有一些问题我解决了只是评论这一行

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);