したがって、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
の背景は同じ色のままです:/
この単純なタスクが非常に複雑であるとは信じられません。
役に立つ可能性のあるコードを省略した場合、または質問に詳細が欠けている場合は、そのことをお気軽に指摘してください。
選択したアイテムの位置変数を配置します。 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);
}
}
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で動作する既定の設定を取得する時間を節約できたことは確かです。
同様の問題に直面しました。それが私の解決策です:
まず、リストビューにカスタムリストセレクターを追加します。
<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>
最善かつ最も簡単な解決策はこれだと思います。 do n't ListView自体に_Android:listSelector
_を設定するか、アダプターに変更を加える必要があります。 do n'tは、OnItemClickListener
内のsetSelection(position)
を呼び出す必要さえあります。
リストビューに設定:
_Android:choiceMode="singleChoice"
_
リスト項目自体の背景を設定:
_Android:background="?android:attr/activatedBackgroundIndicator"
_
それだけです。
これにより、デフォルトのシステム動作が得られます。これがデフォルトの_Android.R.layout.simple_list_item_activated_1
_レイアウトで行われる方法です。
//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" />
//そして、出力を確認します。
lv.setSelector(R.drawable.highlighter);
highlighter.png
描画可能フォルダ内の画像
リストビューで選択したアイテムを強調表示する最も簡単な方法。
私は2週間前にそれを探していましたが、結果はドローアブルセレクターでは不可能です。詳細については、Android Developers Blog: Touch Mode
再開中:指が画面上にあるときのみ、アイテムが選択されます。
他の可能性は、Shaifulが言うように、カスタムアダプターを使用して、varおよびPaintで選択されているアイテムを保存することです。
この投稿を要約し、将来的に他の誰かを助けるために、答えをお勧めします:)
まず、次の内容の_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アイテムが強調表示されます。
-これが誰にも役立つことを願って:)
単純な完全な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"/>
それで全部です。 「単純に選択された」アイテムと「選択されたアイテムを押す」アイテムの異なる視覚状態を定義できます。たとえば、アイテムをプレスで明るくします。
リスト項目(複数選択)を強調表示したままにするには、クリック(アクティブ化)したときに手順に従ってください。
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);
下の画像は、ユーザーが複数のリストアイテムを選択した場合を示しています。
ListItem Highlightedを表示するためにドロアブルを使用できる場合、次のコードを使用する必要があります。
listView.setSelector(R.drawable.bg_image);
できます。