2010-11-22 194 views
27

我有我的应用程序列表视图(这是XML布局):如何改变ListView的项目颜色焦点和点击

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/arrayList" 
     android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
     android:textFilterEnabled="true" 
     android:scrollbars="vertical" 
     android:drawSelectorOnTop="true"> 
</ListView> 

我的列表查看每个项目由两个TextView中的:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout android:layout_width="fill_parent" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/row_container" 
     android:padding="5px" android:layout_height="wrap_content" 
     android:background="@color/white" android:shrinkColumns="0"> 
       <TableRow> 
       <TextView android:layout_height="wrap_content" 
         android:layout_width="wrap_content" android:layout_below="@+id/ 
description" 
         android:id="@+id/description" 
         android:textColor="@color/black" 
         android:scrollHorizontally="true" 
         android:singleLine="true"></TextView> 
     </TableRow> 
     <TableRow> 
       <TextView android:layout_width="wrap_content" 
         android:layout_height="wrap_content" android:id="@+id/result" 
         android:textColor="@color/grey" 
         android:maxLines="1" 
         android:scrollHorizontally="true"></TextView> 
     </TableRow> 

</TableLayout> 

我从ArrayAdapter填充的ListView我以这种方式:

public class Matches extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    //set layout 

    setContentView(R.layout.list_layout); 
    // obtain reference to listview 
    ListView listView = (ListView) findViewById(R.id.arrayList); 

    ArrayAdapter<Match> arrayAdapter = new ArrayAdapter<Match>(
     this, R.layout.custom_row, R.id.description, createItems()) { 

    @Override 
    public View getView (int position, View convertView, ViewGroup parent){ 
     Match item = getItem (position); 
     LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.custom_row, null); 
     TextView description = (TextView)rowView.findViewById(R.id.description); 
     TextView result = (TextView)rowView.findViewById(R.id.result); 
     description.setText(item.description + " Risultato: " + item.result); 
     result.setText(item.date + " " + item.hour); 
     return rowView; 
    } 
    }; 

    listView.setAdapter(arrayAdapter); 

我的目标是能够改变文本科洛科洛r和这些子视图的backgorund,只要选择或按下父级。

我该怎么办?

+0

你会如何将焦点设置未经用户点击? – 2010-11-22 17:01:13

回答

36

无论何时选择父行,都应该考虑选择列表行中的子视图,因此您应该只需在要更改的视图上设置正常状态可绘制/颜色列表,而不需要麻烦的Java代码必要。请参阅this SO post

具体来说,你会你textViews的textColor设置这样一个XML资源:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:drawable="@color/black" /> <!-- focused --> 
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/black" /> <!-- focused and pressed--> 
    <item android:state_pressed="true" android:drawable="@color/green" /> <!-- pressed --> 
    <item android:drawable="@color/black" /> <!-- default --> 
</selector> 
+0

Hey Yoni,`setItemsCanFocus(boolean)`是什么意思? – 2016-01-30 00:41:43

5
<selector xmlns:android="http://schemas.android.com/apk/res/android" >  
    <item android:state_pressed="true" android:drawable="@drawable/YOUR DRAWABLE XML" /> 
    <item android:drawable="@drawable/YOUR DRAWABLE XML" /> 
</selector> 
+0

Hey Dhiral,`setItemsCanFocus(boolean)`是什么意思? – 2016-01-30 00:41:52

31

在你main.xml中在您的ListView如下:

android:drawSelectorOnTop="false" 

android:listSelector="@android:color/darker_gray" 
+5

重点列表单元格在释放触摸后保持突出显示,如果您这样做。 – Tsimmi 2013-09-16 13:50:00

4

这是good article关于如何使用选择器与lis TS。

而是将其设定为在Android的:ListView控件的背景下,我相信你想设置的android:listSelector如下图所示:

<ListView android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:divider="@null" 
    android:dividerHeight="0dip" 
    android:listSelector="@drawable/list_selector" /> 
1
listview.setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(final AdapterView<?> parent, View view, 
       final int position, long id) { 
      // TODO Auto-generated method stub 

      parent.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.listlongclick_selection)); 

      return false; 
     } 
    }); 
+0

先生许多地方创建空指针异常。 – 2017-04-25 05:31:03

0

很老了,但我刚才这个挣扎,这是我在纯xml中解决它的方式。在res/values/colors.xml我加了三种颜色(color _...);

<resources> 

    <color name="black_overlay">#66000000</color> 

    <color name="colour_highlight_grey">#ff666666</color> 
    <color name="colour_dark_blue">#ff000066</color> 
    <color name="colour_dark_green">#ff006600</color> 

</resources> 

RES /抽拉夹我创建listview_colours.xml其中载;

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/colour_highlight_grey" android:state_pressed="true"/> 
    <item android:drawable="@color/colour_dark_blue" android:state_selected="true"/> 
    <item android:drawable="@color/colour_dark_green" android:state_activated="true"/> 
    <item android:drawable="@color/colour_dark_blue" android:state_focused="true"/> 
</selector> 

main_activity.xml找到列表视图和绘制添加到listSelector;

<ListView 
    android:id="@+id/menuList" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:listSelector="@drawable/listview_colours" 
    android:background="#ff222222"/> 
</LinearLayout> 

播放与在listview_colours.xml状态_...项目得到你想要的效果。

还有在这里你可以设置列表视图风格的方法,但我从来没有设法得到它的工作