5

アプリを 2.3 で適切に動作させようとしています (4.0 以降では正常に動作します)。1 つの問題は、リストビューで選択したアイテムの背景を変更できないことです。何を変更する必要があるのか​​ わかりません-誰か知っていますか?

リストビュー自体は次のとおりです。

<ListView
    android:id="@+id/score_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/keyboard"
    android:layout_below="@+id/sort_header"
    android:choiceMode="singleChoice"
    android:divider="#CCCCCC"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/selector" />

4.0 以降で機能するセレクターは次のとおりです (2.3 では色の変更はありません)。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@color/highlight"/>
    <item android:state_pressed="true" android:drawable="@color/highlight"/>
    <item android:state_activated="true" android:drawable="@color/highlight"/>
    <item android:state_selected="true" android:drawable="@color/highlight"/>
</selector>

実際にはこれらの 4 つすべてが必要なわけではありませんが、すべてを試してみたかったのです。

4

4 に答える 4

7

私はまったく同じ問題を抱えていました。XML でこれを行う方法は見つかりませんでしたが、コードで回避策を見つけました。次のコードは、API レベル 7+ をサポートするアプリケーションでテストされています

ListViewまず、アダプターを少し変更する必要があります。

public class ListViewAdapter extends BaseAdapter {
  private int selectedItemPosition = -1;

  // your code

  public void selectItem(int i) {
    selectedItemPosition = i;
  }

  @Override
  public View getView(int i, View view, ViewGroup viewGroup) {

    // your code

    if (i == selectedItemPosition) {
      // set the desired background color
      textView.setBackgroundColor(context.getResources().getColor(R.color.highlight));
    }
    else {
      // set the default (not selected) background color to a transparent color (or any other)
      textView.setBackgroundColor(Color.TRANSPARENT);
    }
    return view;
  }
}

次に、 で選択が変更されたことをアダプタに通知する必要がありますOnItemClickListeneronItemClickMethod

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  // select the item
  ((ListViewAdapter) listview.getAdapter()).selectItem(position);
  // force redraw of the listview (invalidating just "view" is not enough)
  ((ListView) parent).invalidateViews();

  // your code
}

それだけです。選択したアイテムを変更したくない場合はいつでも、で使用されているのと同じコードを使用できますonItemClick()selectItem()が続きinvalidateViews()ます。を呼び出す代わりにinvalidateViews()、アダプタnotifyDataSetChanged()を使用することもできます。

また、適切な listSelector をリスト ビューに追加して、アイテムがクリックされたときにデフォルト セレクターが短時間ちらつくのを回避する必要もあります。ただし、ビュー全体の背景が変更されると、API 7 および 8 のリスト セレクターにバグがあります。ここで回避策を見つけることができます

于 2013-09-16T09:24:17.767 に答える
1

listview でプロパティを設定してみてくださいandroid:cacheColorHint="@null。リストビューの背景は、タッチしてもハイライトされません。

于 2014-02-12T08:55:31.943 に答える
0

AwdKab 応答に書かれているようにandroid:state_activated、API レベル 11 で導入されました。解決策は、リスト項目レイアウトのCheckable上部にインターフェイスを実装することです。私の投稿はこちらを参照してください。View

于 2014-11-17T10:19:41.977 に答える
0

android:state_activatedAPI レベル 11 で導入されました。

このリンクを参照してくださいDrawable Resources

アップデート

アプリでこれを使用しています(APIレベル8)

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selector style for listrow -->
<item 
 android:state_selected="false"
    android:state_pressed="false" 
    android:state_focused="false"
    android:drawable="@color/normal"/> 

<item android:state_pressed="true"
        android:drawable="@color/highlight"/>

<item android:state_selected="true"
     android:state_pressed="false"
     android:drawable="@color/highlight"/>

<item android:state_focused="true"
     android:state_pressed="false"
     android:drawable="@color/highlight"/>
</selector>
于 2013-04-03T22:21:10.253 に答える