web-dev-qa-db-ja.com

バギーListViewは私を悲しませます

ListViewがあり、各アイテムのレイアウトを個別のXMLファイルで定義しました。このファイルには、RatingBarEditTextを含めました。

このListViewに7〜8個のアイテムをプログラムで作成しました。それらをスクロールすると、かなりバグがあるようです。ここではいくつかの例を示します。

  1. 最初の行のEditTextにフォーカスを設定してから、ListViewを下にスクロールすると、他の行のランダムなEditTextsにフォーカスがあります。フォーカスされたものが消えた後の次のEditTextがフォーカスを受け取るようです。これは意図的なものかもしれませんが、ユーザーとしては非常に奇妙に思えます。

  2. フォーカスをEditTextに設定し、仮想キーボードを受け取り、何かを入力して、仮想キーボードの[完了]ボタンをクリックすると、仮想キーボードが消えるとすぐにEditTextが空になります。

  3. EditTextをクリックして仮想キーボードを受け取り、文字の入力を開始すると、入力するとすぐに文字が消えてしまうことがあります。

  4. EditTextをクリックすると、仮想キーボードが表示されますが、EditTextはフォーカスを失い、もう一度EditTextをクリックする必要があります。

  5. RatingBarfocusable="false"に設定しましたが、スクロールホイールを動かすと、フォーカスを取得します。

私の問題の1つは、仮想キーボードに文字を入力すると、表示されているすべてのリストアイテムが再描画されることです(また、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>
35
Andrew

ListViewsはEditTextsをうまく処理できないようです。私はいくつかの調査を行いましたが、コンセンサスは「それをしないでください」のようです。したがって、私が頼ったのは、LinearLayoutを内部に持つScrollViewである単純なレイアウトファイルを作成することです。 onCreateメソッドで、リストアイテムに使用していたビューを拡張し、LinearLayoutに追加します。また、後で各ビューにデータを保存できるように、ビューをArrayListに追加しています。

これは合理的に聞こえますか?

19
Andrew

まあ、これをマニフェストのアクティビティに追加してください...

Android:windowSoftInputMode="adjustPan"

例...

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

私も同じ問題を抱えていました。キーボードが表示されたときにListView内のEditTextがフォーカスを失っていたので、ListViewアイテムからgetViewを配置しました

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

そして、これは私のために働きます。

4

これらの2つの手順で、私が抱えていた同様の問題が解決されました(ListView内の行のEditText +面白いキーボードの動作)。

  1. ListViewが表示されるアクティビティのAndroidManifest.xmlファイルにAndroid:windowSoftInputMode = "adjustPan"属性を追加します。
  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" />

私はSamsungGalaxy S3でテストしましたが、SamsungおよびSwiftKeyキーボードで正常に動作します。

3
pepan

この行にコメントするだけで解決した問題があります

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