web-dev-qa-db-ja.com

android)で選択したListViewアイテムに背景色を設定します

いくつかのアイテムを表示するリストビューがあります。ここで、特定のアイテム(33番目のアイテムなど)にスクロールしたいと思います。私はこれが経由で行うことができることを知っています

myList.setSelection(32);

ただし、UIでは、アイテムは強調表示されません(タッチモードであるため?!)。このアイテムに特定の背景色を適用するにはどうすればよいですか?私は試した

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);

しかし、getSelectedView()がnullを返すため、NullPointerExceptionが発生します。この強調表示を実現する方法はありますか?どのアイテムが「アクティブ」なのかをユーザーに通知する必要があります...

13
codie4711
  1. 選択したアイテムを強調表示するには、listViewのフォーカスを要求し、UIスレッドでsetSelection()を実行する必要があります。これは私のために働いた:
runOnUiThread(new Runnable() {
    public void run() {
        myList.requestFocus();
        myList.setSelection(position);
    }
});

2.アイテムに特定の色を適用する。カスタマイズされたlistItemを使用できます。

a。 listView用にカスタマイズされたlisItemを設定します。

ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.customizedlistitem,arrListView);
myList.setAdapter(listAdapter);

b。レイアウトフォルダーに、customizedlistitem.xmlを作成します

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"  
    Android:id="@+id/customizedlistitem"   
    Android:layout_width="match_parent"   
    Android:layout_height="wrap_content"
    Android:background="@drawable/customizedbackground"/>   

c。ドローアブルフォルダーに、次のようにcustomizedbackground.xmlを作成します。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true" Android:state_pressed="false" Android:drawable="@color/RED"></item>
    <item Android:state_pressed="true" Android:drawable="@color/GREEN"></item>      
    <item Android:drawable="@color/BLACK"></item>   <!-- for other state -->        
</selector>

d。プロジェクトで赤、緑、黒の色が定義されていることを確認します(color.xmlのvaluesフォルダーで定義できます)。

<?xml version="1.0" encoding="utf-8"?>

<resources>  
     <color name="RED">#FF0000</color>
     <color name="GREEN">#008000</color>
     <color name="BLACK">#000000</color>
</resources>
2
vqtr

これを試してみてください、それはうまくいくでしょう-

myList.getChildAt(myList.getSelectedItemPosition()).setBackgroundColor(Color.RED);
2
atulkhatri

XmlファイルのListView:

<ListView Android:id="@+id/Android:list" Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" 
        Android:layout_below="@+id/Tablayoutdesign"
        Android:cacheColorHint="#000000"
        Android:dividerHeight="1dip"
        Android:layout_marginTop="63dip"
        Android:layout_marginBottom="40dip"

        />

次のようなlistselector名で新しいxmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android"> 

  <!-- Selected --> 
  <item 
    Android:state_focused="true" 
    Android:state_selected="false" 
    Android:drawable="@drawable/focused"/> 

  <!-- Pressed -->
  <item 
    Android:state_selected="true" 
    Android:state_focused="false"
    Android:drawable="@drawable/selected" /> 

</selector>

次のようなcolors.xmlファイルを作成します。

<resources>
    <drawable name="focused">#ff5500</drawable>
    <drawable name="selected">#FF00FF</drawable>
</resources>

あなたのJavaコード:

ListView lv= (ListView) findViewById(R.id.list);
lv.setSelector( R.drawable.listselector);
1
Sagar Maiyad

NullPointerExceptionは、おそらくタッチモードになっているためです。タッチモードになっている場合、setSelectionは実際にはlistViewの項目を選択せず​​、意味がわかっている場合はそれを「見る」だけです。

カスタマイズされたアダプタを実行する必要があります(現在使用しているアダプタを拡張するクラスを作成することによって:])

また、カスタムアダプタクラスでは、次のようにgetView(int position、View convertView、ViewGroup parent)メソッドをオーバーライドする必要があります。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
        convertView = inflater.inflate(Android.R.layout.simple_list_item_1, null);
    String content = lista.get(position).toString();
    TextView text = (TextView) convertView.findViewById(Android.R.id.text1);
    text.setText(content);
    convertView.setBackgroundColor(lista.get(position).getBackgroundColor());
    return convertView;
}

コードでは、変数「lista」は、アダプターにあるいくつかのアイテムのリストです。

したがって、アイテムの選択が完了したら、持っているすべてのアイテムに対してgetViewを呼び出すか、listViewからメソッドinvalidateViewsを呼び出すことができますbefore選択を設定します(後でinvalidateViewsを呼び出す場合)選択、選択は無視されます(少なくともタッチモードでは:]))

私は次の方法で試し、問題を解決しました。

位置を受け取るjavaBeanクラスを作成しました。次のように。

_public class Global {

    public static int mListPosition = 0;

    public static int getListPosition() {
        return mListPosition;
    }

    public static void setListPosition(int mListPosition) {
        Global.mListPosition = mListPosition;
    }
}
_

次に、OnListItemClickListener()から選択したアイテムの位置を設定します。次のように

_mList.setOnItemClickListener(new OnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Global.setListPosition(arg2);                   
    }
});
_

次に、アダプタクラスで次の手順を実行します

_@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) mCtx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.details_retailer_list_row, null);

        mHolder = new ViewHolder();
        v.setTag(mHolder);

        mHolder.mDetailsRetailerLayout = (LinearLayout) v
                .findViewById(R.id.details_cart_retailer_row_layout);
        mHolder.mDetailsRetailer = (TextView) v
                .findViewById(R.id.detailsRetailerRow);

    } else {
        mHolder = (ViewHolder) v.getTag();
    }

    final CartDetailsRetailerBean mDetailsRetailerBean = mItems
            .get(position);
    if (position == Global.getListPosition()) {
        mHolder.mDetailsRetailerLayout
                .setBackgroundResource(R.drawable.image1);
    } else {
        mHolder.mDetailsRetailerLayout
                .setBackgroundResource(R.drawable.image2);
    }

    if (mDetailsRetailerBean != null) {
        Log.i("Global Position", "" + Global.getListPosition());
        mHolder.mDetailsRetailer.setText(mDetailsRetailerBean
                .getRetailerName());
    }
    return v;
}    
_

これを試して、Androidリストビューで選択した行の背景色の変更を変更してください。

0

おそらく最も簡単な方法は、背景に状態リストドローアブルを使用することです。これにより、問題のコントロールが選択されているか、フォーカスされているか、無効になっているかなどに応じて、さまざまなスタイルを適用できます。

State List Drawablesの概要については、 この記事 をご覧ください。

0
Mark Allison

行を変更します

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);

myList.getSelectedView().setBackgroundColor(getResources().getColor(Color.RED));
0
Jaydeep Khamar