我有两个片段。第一个带有按钮,另一个带有ListView
(ListFragment)。
我想第一个片段(感谢它的按钮)允许用户浏览第二个片段中的ListView。
所以我希望ListView由第一个带按钮的片段控制。
我在片段之间进行通信没问题(从第一个片段到第二个片段发送命令),但我不知道如何告诉我的ListView选择(以编程方式)特定列表项。
我应该使用哪种ListView,如何告诉ListView选择/突出显示/聚焦其中一项?
当用户按下第一个片段的按钮时,我处于触摸模式。
我应该使用setFocusableInTouchMode(true)
还是setChoiceMode(ListView.CHOICE_MODE_SINGLE)
还是别的什么?
答案 0 :(得分:133)
这适用于所有人:
- 以编程方式选择ListView中的项目
- 突出显示此商品
我正在使用Android ICS,我不知道它是否适用于所有级别的Api。
首先创建一个列表视图(如果你已经在listActivity / listFragment中,则获取它)
然后将列表视图的选择模式设置为单个:Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
然后以编程方式选择您的项目:Mylistview.setItemChecked(position, true);
(位置是一个整数,表示要选择的项目的排名)
现在您的项目实际上已被选中,但您可能看不到任何内容,因为没有选择的视觉反馈。现在您有两个选项:您可以使用预建的列表视图或自定义列表视图。
1)如果您想要预建的列表视图,请尝试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))
根据您选择的预建列表视图,您现在会看到,选中后会勾选复选框或更改背景颜色等...
2)如果您使用自定义列表视图,那么您将定义将在每个项目中使用的自定义布局。在此XML布局中,您将为您行中的每个零件视图定义一个选择器,选择时需要更改它。
假设选择此选项后,您希望您的行更改文本颜色和背景颜色。您的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" />
现在,在drawable文件夹中创建menu_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>
选中后文字将为白色。
然后为你的背景做类似的事情:(记住你不是被迫使用颜色,但你也可以使用drawables)
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>
此处背景在选中时为蓝色,在未选中时为绿色。
我遗漏的主要元素是android:state_activated
。确实(太)许多状态:激活,按压,聚焦,检查,选择......
我不确定我用android:state_activated
和android:state_pressed
提供的例子是否是最好和最干净的,但它似乎对我有效。
但是我不需要创建自己的类来获取 Custom CheckableRelativeLayout (这是脏的和可怕的),也不是我使用CheckableTextViews。我不知道为什么他们使用这种方法,它可能取决于Api水平。
答案 1 :(得分:15)
尝试AbsListView.performItemClick(...)
有关如何使用performItemClick
的信息,请参见this post。
答案 2 :(得分:8)
这对我有用:
1)设置List的选择行为。
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>
希望能帮助任何人!
答案 3 :(得分:5)
尝试mListView.setSelection(position);
答案 4 :(得分:4)
Jecimi的答案对我有用,除了一小部分。我想与其他人分享。在FragmentActivity的onCreate()中调用list.setItemChecked( 0, true );
不起作用。在适配器getView()
的{{1}}中返回-1。
我必须从list.getCheckedItemPosition( )
调用此方法。
答案 5 :(得分:0)
您可以使用ListView#setSelection(int)
答案 6 :(得分:0)
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>
在列表视图中选择一个项目,当点击按钮时,它应该转到特定的选定项目页面。如何操作。代码是上面的代码段
答案 7 :(得分:0)
我喜欢这个:
@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();
}
}
}
答案 8 :(得分:-1)
只需将以下行添加到自定义列表视图的布局中:
android:background="?android:attr/activatedBackgroundIndicator"
有关完整的工作示例,请参阅:
https://elimelec@bitbucket.org/elimelec/custombaseadapter.git