在Android中以编程方式select项目ListView
我有两个片段。 第一个在里面有button,另一个在里面有一个ListView
(ListFragment)。
我想第一个片段(感谢它的button)允许用户浏览第二个片段中的ListView。
所以我希望ListView被第一个带button的片段控制。
我没有任何问题之间的通信(从第一个片段发送订单到第二),但我不知道如何告诉我的ListViewselect(编程)一个特定的列表项。
我应该使用什么types的ListView,以及如何告诉ListViewselect/突出显示/聚焦其中一个项目?
当用户按下第一个片段的button时,我处于触摸模式。
我应该使用setFocusableInTouchMode(true)
或setChoiceMode(ListView.CHOICE_MODE_SINGLE)
或其他?
这是为了每个人都试图:
– 以编程方式selectListView中的项目
– 使这个项目保持突出显示
我正在Android ICS上工作,我不知道它是否适用于所有级别的Api。
首先创build一个列表视图(或者如果你已经在listActivity / listFragment中获取它)
然后设置你的listview的select模式为 : Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
然后用程序select你的项目 : Mylistview.setItemChecked(position, true);
(位置是指示要select的项目的等级的整数)
现在,您的物品已被选中,但您可能完全没有看到物品,因为没有select的视觉反馈。 现在你有两个select: 你可以使用预先build立的列表视图或你的自定义列表视图。
1)如果你想要一个预先build立的列表视图,请尝试simple_list_item_activated_1
, simple_list_item_checked
, simple_list_item_single_choice
等…
你可以像这样设置你的列表视图: setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))
在你select的预build列表视图之后,现在你会看到当你select了一个checkbox,或者背景颜色改变了,等等。
2)如果您使用自定义列表视图,那么您将定义将在每个项目中使用的自定义布局。 在这个XML布局中,您将为您所在行中的每个零件视图select一个select器,在select时需要对其进行更改。
比方说,当你select你想要你的行改变文本的颜色和背景的颜色。 你的XML布局可以写成:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/menu_item_background_selector" android:orientation="horizontal" > <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:textColor="@drawable/menu_item_text_selector" />
现在,在可绘制文件夹中创buildmenu_item_background_selector.xml和menu_item_text_selector.xml。
menu_item_text_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:color="#FFF"> </item> <item android:state_pressed="true" android:color="#FFF"> </item> <item android:state_pressed="false" android:color="#000"> </item> </selector>
选中时文本将变为白色。
然后为你的背景做一些类似的事情(记住,你不是被迫使用颜色,但你也可以使用drawable)
menu_item_background_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:color="#0094CE"> </item> <item android:state_pressed="true" android:color="#0094CE"> </item> <item android:state_pressed="false" android:color="#ACD52B"> </item> </selector>
这里的背景在select时是蓝色的,而没有select时是绿色的。
我缺less的主要元素是android:state_activated
。 确实有(太)许多州:激活,按下,聚焦,检查,select…
我不知道,如果我给了android:state_activated
和android:state_pressed
是最好的,最干净的,但它似乎为我工作。
但是我不需要自己创build一个类来获得一个Custom CheckableRelativeLayout (这是脏的,可怕的),也没有使用CheckableTextViews。 我不知道为什么他们使用这种方法,可能取决于Api级别。
试试AbsListView.performItemClick(…)
看到这篇文章如何使用performItemClick
。
这对我来说是有效的:
1)设置列表的select行为。
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
2)设置指定位置的检查状态。
mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter.
3)在样式资源(res / values)中添加一个新样式,如下所示:
<style name="activated" parent="android:Theme.Holo"> <item name="android:background">@android:color/holo_green_light</item> </style>
随意使用你喜欢的颜色。
4)在ListView中使用先前定义的样式 :
<ListView android:id="@+id/listview" style="@style/activated" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:divider="@android:color/transparent" android:dividerHeight="0dp"/>
或者在你用作行的布局中。
<?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="wrap_content" style="@style/activated" > <!--widgets for your row here--> </LinearLayout>
希望能帮助任何人!
杰西米的答案为我工作,除了一小部分。 我想分享给别人。 调用list.setItemChecked( 0, true );
在onCreate()的FragmentActivity没有工作。 在适配器list.getCheckedItemPosition( )
getView()
中返回-1。
我必须从protected void onPostCreate( Bundle savedInstanceState )
调用此方法。
试试mListView.setSelection(position);
你可以使用ListView#setSelection(int)
package com.example.samsung; import com.example.samsung.*; import com.example.samsung.R; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Spinner; import android.widget.Toast; public class Firstscreen extends Activity implements OnItemSelectedListener { Button btn; Spinner sp; public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_firstscreen); btn = (Button) findViewById(R.id.bn); sp= (Spinner) findViewById(R.id.sp); } public void button (View v){ { Intent i = new Intent(Firstscreen.this,ML1676P.class); startActivity(i); } Spinner s1 = (Spinner) findViewById(R.id.sp); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, product); // find other layout parameters s1.setAdapter(adapter); s1.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } private Object product() { // TODO Auto-generated method stub return null; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.firstscreen, menu); return true; } @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".Firstscreen" android:orientation="vertical" > <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FF35B5E5" android:layout_centerInParent="true" android:text="CHOOSE THE PRODUCT FROM THE LIST" /> <Spinner android:id="@+id/sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawSelectorOnTop="true" /> <Button android:id="@+id/bn" android:layout_width="285dp" android:layout_height="wrap_content" android:text=" GO " android:onClick="button"/> </LinearLayout>
在列表视图中select一个项目,当点击button时,它应该进入特定的选定项目页面。代码片段如上
我喜欢这个:
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { try { int pos = 0; listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) ); } catch (Exception e) { e.printStackTrace(); } } }
只需将以下行添加到自定义列表视图的布局即可:
android:background="?android:attr/activatedBackgroundIndicator"
有关完整的示例,请参阅:
HTTPS://elimelec@bitbucket.org/elimelec/custombaseadapter.git