我想知道如何更改listView上所选项目的背景颜色。我只想更改用户点击的特定项目,这意味着如果用户点击另一个项目,它将是突出显示的项目。好吧,因为我希望它尽可能保持简单并使用默认的android listview我改为使用此代码:
record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
try{
for (int ctr=0;ctr<=record_items.length;ctr++){
if(i==ctr){
record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN);
}else{
record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE);
}
}
}
catch (Exception e){
e.printStackTrace();
}
Log.v("Selected item",record_list.getItemAtPosition(i));
}
});
好的,这个有效,但问题是它很慢。现在我想知道是否还有其他任何可以做的方法,它会提供与我相同的输出。
我尝试使用record_list.getSelectedView().setBackgroundColor(Color.CYAN);
,但它给了我一个空指针异常。
我也尝试过了selector.xml,但它也没有做到这一点。 此外,ListView上有一个名为listSelector的属性。如文档“Drawable用于指示列表中当前选定的项目”所述,它是可绘制的。我也相信这应该可以做到这一点,是的,它可以在我的模拟器上进行,但不能在我的Galaxy选项卡上进行。我也尝试过其他方法但没有任何效果,因为我想要它。
答案 0 :(得分:69)
您可以跟踪当前所选元素的位置:
OnItemClickListener listViewOnItemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
mSelectedItem = position;
mAdapter.notifyDataSetChanged();
}
};
并覆盖适配器的getView方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view = View.inflate(context, R.layout.item_list, null);
if (position == mSelectedItem) {
// set your color
}
return view;
}
对我来说,这就是诀窍。
答案 1 :(得分:67)
您可以使用选择器。更改颜色值并根据需要修改以下内容。
可绘制文件夹中的bkg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/pressed" />
<item android:state_focused="false"
android:drawable="@drawable/normal" />
</selector>
drawable文件夹中的pressed.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF1A47"/> // color
<stroke android:width="3dp"
android:color="#0FECFF"/> // border
<padding android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
<corners android:bottomRightRadius="7dp" // for rounded corners
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
drawable文件夹中的normal.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF"/>
<stroke android:width="3dp"
android:color="#0FECFF" />
<padding android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
<corners android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
将背景绘制设置为listview自定义布局,以便为每行充气
我建议使用自定义列表视图和自定义适配器。
android:background="@drawable/bkg"
如果您没有使用自定义适配器,可以将listselector设置为listview,如下所示
android:listSelector="@drawable/bkg"
答案 2 :(得分:23)
定义变量
private ListView mListView;
初始化变量
mListView = (ListView)findViewById(R.id.list_view);
listview的OnItemClickListener
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adpterView, View view, int position,
long id) {
for (int i = 0; i < mListView.getChildCount(); i++) {
if(position == i ){
mListView.getChildAt(i).setBackgroundColor(Color.BLUE);
}else{
mListView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
}
}
}
});
构建并运行项目 - 完成
答案 3 :(得分:15)
如果您希望单击项后保持突出显示,则需要手动将其设置为在onItemClick侦听器中选中
Android ListView selected item stay highlighted:
myList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setSelected(true); // <== Will cause the highlight to remain
//... do more stuff
}});
这假设你的选择器中有一个state_selected项目:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:state_pressed="true" android:drawable="@color/red" />
<item android:state_enabled="true" android:state_focused="true" android:drawable="@color/red" />
<item android:state_enabled="true" android:state_selected="true" android:drawable="@color/red" />
<item android:drawable="@color/white" />
</selector>
答案 4 :(得分:7)
方法1:
更新xml布局活动/片段中的ListView:
<ListView
...
android:choiceMode="singleChoice"
android:listSelector="@android:color/darker_gray"
/>
就是这样,你已经完成了!
如果您想要以编程方式处理此问题,请使用方法2 ...
方法2:
如果你正在使用ListFragment,你可以覆盖onListItemClick(),使用视图来设置颜色。保存当前选定的视图以重置上一个选择的颜色。
请注意,这仅适用于适合一个屏幕的列表视图,因为视图已被回收。
public class MyListFragment extends ListFragment {
View previousSelectedItem;
...
@Override
public void onListItemClick(ListView parent, View v, int position, long id) {
super.onListItemClick(parent, v, position, id);
if (previousSelectedItem!=null) {
previousSelectedItem.setBackgroundColor(Color.WHITE);
}
previousSelectedItem=v;
v.setBackgroundColor(Color.BLUE);
}
}
答案 5 :(得分:6)
首先,您可以在可绘制文件夹drawable/list_item_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true">
<shape android:shape="rectangle">
<solid android:color="#333333" />
<padding android:left="5dp" android:right="5dp" />
</shape></item>
<item><shape android:shape="rectangle">
<solid android:color="#222222" />
</shape></item>
</selector>
然后在列表视图中将背景指定为
android:background="@drawable/list_item_selector"
答案 6 :(得分:6)
对于那些想知道在向下滚动时确保选择行仍需要做什么的人。它是 state_activated 其余部分由内部功能处理,您不必担心切换,并且可以选择多个项目。我不需要使用notifyDataSetChanged()或setSelected(true)方法。
将此行添加到您的选择器文件中,对于我drawable \ row_background.xml
<?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_blue_light"/>
<item android:state_enabled="true" android:state_pressed="true" android:drawable="@android:color/holo_blue_light" />
<item android:state_enabled="true" android:state_focused="true" android:drawable="@android:color/holo_blue_bright" />
<item android:state_enabled="true" android:state_selected="true" android:drawable="@android:color/holo_blue_light" />
<item android:state_activated="true" android:drawable="@android:color/holo_blue_light" />
<item android:drawable="@android:color/transparent"/>
</selector>
然后在layout \ custom_row.xml
中<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dip"
android:background="@drawable/row_background"
android:orientation="vertical">
<TextView
android:id="@+id/line1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
有关更多信息,我正在使用ListView适配器 myList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 和 myList.setMultiChoiceModeListener(new MultiChoiceModeListener()...
来自此示例:http://www.androidbegin.com/tutorial/android-delete-multiple-selected-items-listview-tutorial/
此外,您(应该)将此结构用于列表 - 适配器耦合:List myList = new ArrayList();
而不是:ArrayList myList = new ArrayList();
答案 7 :(得分:2)
我发现最简单的方法:
在您的活动XML中添加以下行:
<ListView
...
android:choiceMode="singleChoice"
android:listSelector="#666666"
/>
或以编程方式设置这些属性:
listView.setSelector(Drawable selector)
listView.setSelector(int resourceId)
我的具体例子:
<ListView
android:choiceMode="singleChoice"
android:listSelector="#666666"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView"/>
答案 8 :(得分:2)
我知道这是一个老问题,但我为这个需求提供了一个简单的解决方案(没有循环!):
//On your adapter create a variable:
private View lastSelectedItem;
//Define the folowing method:
private void toggleBackgroundItem(View view) {
if (lastSelectedItem != null) {
lastSelectedItem.setBackgroundColor(Color.TRANSPARENT);
}
view.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
lastSelectedItem = view;
}
//finally invoque the method onItemClick
lvSac.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick (AdapterView < ? > adapterView, View view,int i, long l){
toggleBackgroundItem(view);
}
}
答案 9 :(得分:2)
我也做了类似的事情:突出显示所选列表项的背景(将其更改为红色)并将项目中的文本颜色设置为白色。
我可以想出&#34; 简单但效率不高&#34;办法:
维护所选项目在自定义适配器中的位置,并在ListView的OnItemClickListener
工具中更改它:
// The OnItemClickListener implementation
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mListViewAdapter.setSelectedItem(position);
}
// The custom Adapter
private int mSelectedPosition = -1;
public void setSelectedItem (int itemPosition) {
mSelectedPosition = itemPosition;
notifyDataSetChanged();
}
然后在getView()
方法中更新所选项目的背景和文字颜色。
// The custom Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
...
if (position == mSelectedPosition) {
// customize the selected item's background and sub views
convertView.setBackgroundColor(YOUR_HIGHLIGHT_COLOR);
textView.setTextColor(TEXT_COLOR);
} else {
...
}
}
在搜索了一段时间后,我发现许多人提到要设置android:listSelector="YOUR_SELECTOR"
。经过一段时间的尝试,我找到了最简单的方法来突出显示所选的ListView项目的背景,只需将两行设置为ListView的布局资源:
android:choiceMode="singleChoice"
android:listSelector="YOUR_COLOR"
还有其他方法可以让它发挥作用,例如自定义activatedBackgroundIndicator
主题。但我认为这将是一个更通用的解决方案,因为它会影响整个主题。
答案 10 :(得分:2)
使用下面的xml作为listitem后台,它将解决所有问题。 您向下滚动时会突出显示所选内容。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_orange_dark" android:state_pressed="true"/>
<item android:drawable="@android:color/holo_green_light" android:state_selected="true"/>
<item android:drawable="@android:color/holo_green_light" android:state_activated="true"/>
谢谢, Nagendra
答案 11 :(得分:1)
即使列表很长,这是一个可以处理选择的简单方法:
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder=new Holder();
View rowView;
rowView = inflater.inflate(R.layout.list_item, null);
//Handle your items.
//StringHolder.mSelectedItem is a public static variable.
if(getItemId(position)==StringHolder.mSelectedItem){
rowView.setBackgroundColor(Color.LTGRAY);
}else{
rowView.setBackgroundColor(Color.TRANSPARENT);
}
return rowView;
}
然后在你的onclicklistener:
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1);
catagoryAdapter.notifyDataSetChanged();
.....
答案 12 :(得分:1)
<table width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td align='center'>
<div style='border: 1px solid #CCC;width:538px;font-family:Helvetica; padding: 30px'>
<span style='font-size: 30px;text-align: center;color: #606060;font-weight: bold;'> Just one more step... </span>
<br> <br> <br>
<a href='#' style='text-decoration: none'> <div style='color: white; padding: 20px 50px 20px 50px; background: #69B8D6; border: 1px solid #69B8D6;text-align: center;width: 156px;font-size: 18px;font-weight: bold;border-radius:3px;'> Activate Account </div> </a> </div>
</td>
</tr>
</table>
答案 13 :(得分:1)
假设您希望每次都单击一个项目。那么这段代码效果很好。我们将listview名称作为stlist
stList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// here i overide the onitemclick method in onitemclick listener
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//color change
//selected item colored
for(int i=0; i<stList.getAdapter().getCount();i++)
{
stList.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
}
parent.getChildAt(position).setBackgroundColor(Color.GRAY);
});
答案 14 :(得分:0)
在ListView集中:
android:choiceMode="singleChoice"
为背景创建选择器(drawable / selector_gray.xml):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/gray" android:state_checked="true" />
<item android:drawable="@color/white" />
</selector>
为列表添加项目:
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:background="@drawable/selector_gray"
android:textColor="@color/colorPrimary"
tools:text="Your text" />
在ViewHolder中,您可以为此项目充气。
答案 15 :(得分:0)
这很简单。在“ OnItemClick”的构造函数中,使用参数“ view”,它是代表listView或GridView的项目视图的第二个参数,它成为adapterView自身创建的新项目的视图。因此,仅将新颜色设置为“ SELECTED ITEM”本身,请执行以下操作:
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){
//view is instead of the view like textView , ImageView, or whatever
view.setBackgroundColor(Color.green);
}
如果您执行任何其他代码来设置新颜色,则会遇到尴尬的行为,例如绿色将应用于未单击的项目。
答案 16 :(得分:0)
nameofList.getChildAt(position).setBackgroundColor(RED);
为我工作