Buggy ListView让我难过

我有一个ListView ,我已经在一个单独的XML文件中定义每个项目的布局。 在这个文件中,我包含了一个RatingBar和一个EditText

我已经编程在这个ListView创build7-8项。 当我滚动他们时,它似乎是相当多的错误。 这里有些例子:

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

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

  3. 有时,当我点击一个EditText ,接收一个虚拟键盘并开始input字母时,只要我input字母就会消失。

  4. 当我点击一个EditText ,虚拟键盘显示自己,但EditText失去焦点,我不得不再次点击EditText

  5. 即使我已经将RatingBar设置为RatingBar focusable="false" ,但如果我移动滚轮,它仍然抓住焦点。

我的问题之一是所有的可见列表项重绘,当我在虚拟键盘中键入一个字符(因为EditText文本设置为一些数据,这是空的,它被清除。我不明白为什么Android每次我input一个字符就决定重画列表。

这里是我用来绘制它们的XML。 他们是白色的泡沫,一个灰色的边界,一些文字,一个RatingBar和一个EditText里面:

 <?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> 

Solutions Collecting From Web of "Buggy ListView让我难过"

这听起来像ListViews无法很好地处理EditTexts。 我做了一些研究,共识似乎是“不这样做”。 所以我采取的是创build一个简单的布局文件,这是一个带有LinearLayout的ScrollView。 在我的onCreate方法中,我膨胀我用于我的列表项的视图,并将其添加到LinearLayout。 我还将视图添加到ArrayList中,以便稍后将数据保存在每个视图中。

这听起来合理吗?

那么,把这个添加到你的活动清单…

 android:windowSoftInputMode="adjustPan" 

例…

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

我遇到了同样的问题。 我的EditView的LisView里面的键盘出现时失去了焦点,所以从我放的ListView项目的getView

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

而这个工作对我来说。

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

  1. android:windowSoftInputMode =“adjustPan”属性添加到ListView所在活动的AndroidManifest.xml文件中。
  2. android:descendantFocusability =“afterDescendants”属性添加到ListView本身。

这是一个实际的例子:

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上testing过,它和三星以及SwiftKey键盘都可以正常工作。

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

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