web-dev-qa-db-ja.com

Android-一度クリックすると、ListViewのアイテムを強調表示したままにします

したがって、2つのListViewウィジェットを持つアクティビティがあり、最初のウィジェットで値を選択すると、2番目のウィジェットには最初のListViewでの選択に関連する値が入力されます。このメカニズムは問題なく機能しますが、今ではユーザーの選択が強調表示されたままになるようにします。私はこのトピックに関連するかなりの量の質問を読みましたが、これを達成できる方法は無数にあるようですが、emの4-5を試した後でも、それを動作させることはできません。

Android:listSelector="#CCCCCC" XML属性を使用して2番目のListViewで動作するようにしましたが、OnItemClickListenerがミックスに導入されると、これは消去されます最初のListViewで使用します)。

これまでのところ、私が持っているものはここにあります:

カスタムOnItemClickListenerこのトピックに関するさまざまな回答を参照していることがわかりました(2番目のListViewに情報を読み込むために少し変更しました)。

private class ItemHighlighterListener implements OnItemClickListener {

    private View oldSelection = null;

    public void clearSelection() {
        if(oldSelection != null) {
            oldSelection.setBackgroundColor(Android.R.color.transparent);
        }
    }

    public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
        clearSelection();
        oldSelection = view;
        view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector));
        loadClubs(mXMLPortalOptions.getRegion(pos).getId());
        mClubList.setAdapter(new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item_white, mClubs));
    }
}

これが私のlist_selector.xmlファイルです:

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

    <item Android:state_selected="true"><shape>
            <solid Android:color="#CCCCCC" />
        </shape></item>

    <item Android:state_selected="false"><shape>
            <solid Android:color="#FFFFFF" />
        </shape></item>

</selector>

メソッド(OnItemClick)が呼び出されて実行されますが、私のListItemの背景は同じ色のままです:/

この単純なタスクが非常に複雑であるとは信じられません。

役に立つ可能性のあるコードを省略した場合、または質問に詳細が欠けている場合は、そのことをお気軽に指摘してください。

36

選択したアイテムの位置変数を配置します。 onItemClicked()メソッドの位置を変更します。 getView()内のリストアダプターで選択した位置を確認し、選択したアイテムの背景を設定します。

public class TestAdapter extends BaseAdapter
{
    private Context context;
    private ArrayList<TestList> testList;
    private int selectedIndex;
    private int selectedColor = Color.parseColor("#1b1b1b");

    public TestAdapter(Context ctx, ArrayList<TestList> testList)
    {
        this.context = ctx;
        this.testList = testList;
        selectedIndex = -1;
    }

    public void setSelectedIndex(int ind)
    {
        selectedIndex = ind;
        notifyDataSetChanged();
    }

    @Override
    public int getCount()
    {
        return testList.size();
    }

    @Override
    public Object getItem(int position)
    {
        return testList.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    private class ViewHolder
    {
        TextView tv;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View vi = convertView;
        ViewHolder holder;
        if(convertView == null)
        {
            vi = LayoutInflater.from(context).inflate(R.layout.test_list_item, null);
            holder = new ViewHolder();

            holder.tv = (TextView) vi;

            vi.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) vi.getTag();
        }

        if(selectedIndex!= -1 && position == selectedIndex)
        {
            holder.tv.setBackgroundColor(Color.BLACK);
        }
        else
        {
            holder.tv.setBackgroundColor(selectedColor);
        }
        holder.tv.setText("" + (position + 1) + " " + testList.get(position).getTestText());

        return vi;
    }

}

リスト項目がクリックされたときにselectedIndex変数を設定するようになりました。

public class TestActivity extends Activity implements OnItemClickListener
{
    // Implemented onItemClickListener

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        adapter.setSelectedIndex(position);
    }
}
62
Shaiful

Shaifulの優れたソリューションを拡張するには、あなたの状況でShaifulを働かせないかもしれません。

使用しているコードがすべてpublic void onListItemClick(ListView l, View v, int index, long id)にある場合、フラグメントを使用しており、OnListItemClickListenerを実装する代わりにインターフェイスを宣言する必要がある場合、またはIDE=エラーを生成する場合は、変数とメソッドに静的にアクセスする必要があります。

public static int selectedPosition = 0;
ArrayAdapter<Your_obj> adapter = null;

@Override
public void onListItemClick(ListView l, View v, int index, long id) {
    super.onListItemClick(l, v, index, id);

        selectedPosition = index;
        Your_adapter.setSelectedIndex(selectedPosition);
        adapter.notifyDataSetChanged();
}

そして、Your_adapterで:

private static int selectedIndex;

//public Your_adapter...

public static void setSelectedIndex(int ind) {
    selectedIndex = ind;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    WellHolder holder = null;

    if (null == convertView) {

                //set up your "holder"
    }

    if (position == selectedIndex) {
        convertView.setBackgroundColor(convertView.getResources().getColor(R.color.cyan));
    }
    else {
        convertView.setBackgroundColor(convertView.getResources().getColor(R.color.silver));
    }

    return convertView;
}

他のいくつかの違いは、変数を「0」または「-1」として初期化する必要がなく、notifyDataSetChanged()がアクティビティで呼び出されることです。

もう一度、@ Shaifulのソリューションに感謝します。セレクター/アイテム/フォーカス/押された/などを回避しながら、iOSでAndroidで動作する既定の設定を取得する時間を節約できたことは確かです。

5
whyoz

同様の問題に直面しました。それが私の解決策です:

まず、リストビューにカスタムリストセレクターを追加します。

<ListView
    Android:id="@+id/list"
    Android:layout_width="match_parent"
    Android:layout_height="fill_parent"
    Android:listSelector="@drawable/listselector" />

Listselector.xml内:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_accelerated="false"
        Android:drawable="@drawable/bg" />
</selector>

そして最後に、ハイライトの色で描画可能なbg.xmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#33b5e6"/>
</shape>
4
zjadarka

最善かつ最も簡単な解決策はこれだと思います。 do n't ListView自体に_Android:listSelector_を設定するか、アダプターに変更を加える必要があります。 do n'tは、OnItemClickListener内のsetSelection(position)を呼び出す必要さえあります。

  1. リストビューに設定:

    _Android:choiceMode="singleChoice"
    _
  2. リスト項目自体の背景を設定:

    _Android:background="?android:attr/activatedBackgroundIndicator"
    _
  3. それだけです。

これにより、デフォルトのシステム動作が得られます。これがデフォルトの_Android.R.layout.simple_list_item_activated_1_レイアウトで行われる方法です。

3
Robyer
//create a list_itemselectorin drawable folder
//you will get the list item selected background color change once you select //the item

    <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

        <!-- Focused State -->
        <item Android:state_focused="true"><shape>
                <solid Android:color="#66FFFFFF" />
            </shape></item>
        <!-- Pressed State -->

        <item Android:state_pressed="true"><shape>
                <solid Android:color="@color/Black" />
            </shape></item>

        <!-- Default State -->
        <item><shape>
                <solid Android:color="@color/Black" />
            </shape></item>

    </selector>


    //create a list in layout folder
      <ListView
            Android:id="@+id/mySlidingList"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:choiceMode="singleChoice"
            Android:divider="@color/GrayHot"
            Android:dividerHeight="1dip"
            Android:listSelector="@drawable/list_itemselector"
            Android:scrollbars="none" />

//そして、出力を確認します。

2
DeepakPanwar

lv.setSelector(R.drawable.highlighter);

highlighter.png描画可能フォルダ内の画像
リストビューで選択したアイテムを強調表示する最も簡単な方法。

2
Supun Perera

私は2週間前にそれを探していましたが、結果はドローアブルセレクターでは不可能です。詳細については、Android Developers Blog: Touch Mode

再開中:指が画面上にあるときのみ、アイテムが選択されます。

他の可能性は、Shaifulが言うように、カスタムアダプターを使用して、varおよびPaintで選択されているアイテムを保存することです。

2
i.masm

この投稿を要約し、将来的に他の誰かを助けるために、答えをお勧めします:)

まず、次の内容の_res/drawable/list_item_background.xml_ファイルを作成する必要があります。

_<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item
        Android:state_activated="true"
        Android:drawable="@color/list_item_activated" />
    <item
        Android:drawable="@color/list_item_default" />
</selector>
_

もちろん、描画可能なリソースを指定します。また、_<item>_、_state_pressed_などのさまざまな状態を持つ他の_state_focused_要素を追加することもできます。

次に、backgroundパラメーターをカスタムリストアイテムViewGroup要素(f.i. _res/layout/list_item_layout.xml_)に次のように設定する必要があります。

_Android:background="@drawable/list_item_background"
_

次のステップは、カスタムAdapterクラスを変更することです。以下は、次のコードフラグメントです。

_public class CustomAdapter extends BaseAdapter {
    private List<Item> items;
    private LayoutInflater itemInflater;        
    private int selectedIndex; // add this

    public CustomAdapter(Context c, List<Item> items) {
        this.items = items;
        this.itemInflater = LayoutInflater.from(c);
        selectedIndex = -1; // add this
    }

    /* add this */
    public void setSelectedIndex(int index) {
        selectedIndex = index;
        notifyDataSetChanged();
    }

    /* other adapter's stuff */

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null) {
            convertView = itemInflater.inflate(R.layout.list_item_layout, parent, false);
        }

        // add this
        convertView.setActivated(selectedIndex != -1 && position == selectedIndex);

        /* do some stuff */

        return convertView;
    }
}
_

最後に、_AdapterView.OnItemClickListener_のsetSelectedIndex(position)メソッドでonItemClick(...)アダプターのメソッドを呼び出す必要があります。

_public class YourActivity extends Activity
        implements AdapterView.OnItemClickListener {

    private CustomAdapter mCustomAdapter;

    /* activity implementation */

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        mCustomAdapter.setSelectedIndex(position);
    }
}
_

これで、適切なリスト項目の強調表示に満足できます:)

追伸リストで複数選択モードを有効にする場合は、listViewインスタンスが保持されるアクティビティクラスに次の文字列を配置します。

_listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
_

したがって、適切なmultipleアイテムが強調表示されます。

-これが誰にも役立つことを願って:)

0
Eugene Matiyuk

単純な完全なXMLソリューションがあり、それは私にとってはうまくいきました。最初に、「通常」状態がリストアイテムの「選択された非押下」視覚状態に対応し、state_pressed = trueが「押下」視覚状態に対応するセレクタコードでXML描画可能を定義します。ホロブルーの選択に似たファイル「custom_item_selector.xml」の例:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed="true">
        <shape Android:shape="rectangle">
            <solid
                Android:color="#643292ff">
            </solid>
            <stroke
                Android:width="1dp"
                Android:color="#c83292ff">
            </stroke>
        </shape>
    </item>
    <item>
        <shape Android:shape="rectangle">
            <solid
                Android:color="#323292ff">
            </solid>
            <stroke
                Android:width="1dp"
                Android:color="#783292ff">
            </stroke>
        </shape>
    </item>
</selector>

(そこにフォーカス状態を設定することもできます)。次に、このxml-drawableをListViewのlistSelectorとして適用し、希望のchoiceModeを設定します。

<ListView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/listView"
            Android:choiceMode="singleChoice"
            Android:listSelector="@drawable/custom_item_selector"/>

それで全部です。 「単純に選択された」アイテムと「選択されたアイテムを押す」アイテムの異なる視覚状態を定義できます。たとえば、アイテムをプレスで明るくします。

0
jetc

リスト項目(複数選択)を強調表示したままにするには、クリック(アクティブ化)したときに手順に従ってください。

1。背景をリストアイテムレイアウトに描画可能として設定します。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="40dp"
        Android:background="@drawable/list_item_selector">

        <ImageView
            Android:id="@+id/icon"
            Android:layout_width="22px"
            Android:layout_height="22px"
            Android:layout_marginLeft="4px"
            Android:layout_marginRight="10px"
            Android:layout_marginTop="4px"
            Android:src="@mipmap/ic_launcher" >
        </ImageView>

        <TextView
            Android:id="@+id/label"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@+id/label"
            Android:textSize="20px" >
        </TextView>
    </LinearLayout>

2。描画可能セレクター

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

<item Android:state_pressed="true"     Android:drawable="@Android:color/holo_red_light" />

<item Android:state_activated="true" Android:drawable="@Android:color/holo_orange_dark" />

</selector>

3。リストビューは複数選択モードを設定します

getListView()。setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

押したときenter image description here

下の画像は、ユーザーが複数のリストアイテムを選択した場合を示しています。

アクティベートされた場合enter image description here

0
Annada

ListItem Highlightedを表示するためにドロアブルを使用できる場合、次のコードを使用する必要があります。

listView.setSelector(R.drawable.bg_image);

できます。

0
Suresh Sharma