2011-07-21 20 views
0

私がしたいことはとても簡単です。Androidリストで選択項目を強調する方法

私はアイテムでいっぱいのListFragmentを持っています。私が1つのアイテムをタッチすると、そのアイテムのテキストまたは背景が色を変えたい。これは、この項目が選択されていることを意味します。今度は別のアイテムに触れると、最後のアイテムを通常の状態に戻して新しいアイテムを選択します。

どうすればいいですか?

ありがとうございました。

EDIT:最後のビューを覚え

ソリューションが動作しますが、それは状態や色だ設定のいずれかへの最後のビューへのアクセスに依存しています。今これは動作します。

しかし、私は新しい問題があります。また、リスト内の項目を上に移動する機能もあります。ここで

それは次のとおりです。

public void MoveUp(){ 
    if (lastselected > 0){ 
     String item = adapter.getItem(lastselected); 
     adapter.remove(item); 
     adapter.insert(item, lastselected-1);   
     lastselected = lastselected -1; 
     System.err.println("Is View NULL " + (getListView().getChildAt(lastselected) == null)); 
    } 
} 

問題(そして、私が提案した第二の溶液中で、「マーク解除に何をすべきか」を主張し、なぜこれがある)は、64項目の最後の項目に表示されていることです関数getChildAtはnullを返します。それはnullになるので、私は選択状態を設定することも、色を戻すこともできません。

これは私のデバッグプリントアウトです:

07-21 18:30:54.490: WARN/System.err(6733): Is View NULL true 
07-21 18:30:54.670: WARN/System.err(6733): Is View NULL true 
07-21 18:30:54.860: WARN/System.err(6733): Is View NULL true 
07-21 18:30:55.020: WARN/System.err(6733): Is View NULL true 
07-21 18:30:55.180: WARN/System.err(6733): Is View NULL false 
07-21 18:30:55.720: WARN/System.err(6733): Is View NULL false 
07-21 18:30:55.930: WARN/System.err(6733): Is View NULL false 
07-21 18:30:56.110: WARN/System.err(6733): Is View NULL false 
07-21 18:30:56.340: WARN/System.err(6733): Is View NULL false 

そして、私がやって保たれ、すべてがアップボタンを押しています。もしこの関数が非ヌルポインタを返すとわかったら、それは非常に感謝しています。ありがとう

答えて

1

これを行うにはonListItemClick()-methodを使用できます。 1つのアイテムがクリックされると呼び出されます。

背景/テキストの色を変更し、ハイライト表示することができます。この状態を安全にしたい場合は、選択したアイテムのID(または何か)を保持するクラスのフィールドを使用してこの状態を行うことができます。

ちょっとイラスト

public class YourFragment extends ListFragment{ 

    private long current_id; 
    private ListView current_lv; 

    public void onListItemClick (ListView l, View v, int position, long id){ 
     // Check if the fields are initialized: 
     if (current_id != null && current_lv != null){ 
      // Unmark the previously selected entry: 
      unmark(); 
     } 
     // Mark the currently selected entry by using the 
     // given ListView "l" and long "id" 

     // Change the field-values: 
     current_id = id; 
     current_lv = l; 
    } 

    private void unmakr(){ 
     // Take the fields to unmark the entry 
    } 

} 

私はListViewを使用して、エントリのIDは、以前に一つの選択されたかを判断するために、あなたの場合は、しかしViewまたは何か他のものを使用することができます好き。

ただし、この方法でどのパラメータが指定されているか注意してください。

+0

この方法の問題点は、以前に押されたビューにアクセスして色を標準に戻す方法が見つからないことです。 – aarelovich

+0

これは、現在選択されているEntry-IDを保存するときに表示されます。したがって、最後に選択されたentry-id(そしてそれをマークすることができます)を持っていて、それを現在選択されているEntry-IDに変更します。 –

+0

これは私が理解した。私が意味することは、getView(last_entry_id)のような機能はないということです。少なくとも私はそれを見つけることができません。 – aarelovich

3

利用セレクター(See StateList)

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
    android:state_pressed="true" 
    android:drawable="@color/white" /> 
    <item 
    android:state_selected="true" 
    android:drawable="@color/selected_color" /> 
    <item 
    android:drawable="@color/default_color" /> 
</selector> 

ごlist_itemの背景には、上記のXMLへの参照である、これを置きます。

android:background="@drawable/list_item_bg_selector" 
+0

このアプローチは間違いなく機能しません。 1つの理由は、state_lastpressedなどの状態がないことだけです。私は言及したすべての州を試しましたが、それらのどれも、指がスクリーンから離れた後でアイテムを選択した色に保っていません。 – aarelovich

+0

私は理解していない、アイテムが "state_pressed"で色が変わるときは、一度に1つのアイテムしかstate_pressedとして持つことはできないのですか? –

+0

正しい。しかし、押されたことは、指で押されているアイテムを意味します。指が画面を離れると、色が元に戻ります。 – aarelovich