在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_1simple_list_item_checkedsimple_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_activatedandroid: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