将背景颜色设置为android中选定的ListView项

时间:2011-05-19 07:33:21

标签: android listview android-emulator selection android-listview

我有一个列表视图,显示了几个项目。现在我想滚动到一些特定项目(例如第33项)。我知道这可以通过

完成
myList.setSelection(32);

但是在UI上,该项目没有收到任何突出显示(因为它处于触摸模式?!)。如何为此项目应用特定背景颜色?我试过了

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);

但是我得到一个NullPointerException,因为getSelectedView()返回null。有没有办法实现这个突出显示?我必须以某种方式通知用户哪个项目是“活动的”...

7 个答案:

答案 0 :(得分:2)

  1. 要突出显示所选项目,您应该为listView请求焦点并在UI线程中运行setSelection()。这对我有用:
  2. runOnUiThread(new Runnable() {
        public void run() {
            myList.requestFocus();
            myList.setSelection(position);
        }
    });
    

    2.将特定颜色应用于项目。您可以使用自定义的listItem。

    一个。为listView设置自定义lisItem:

    ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.customizedlistitem,arrListView);
    myList.setAdapter(listAdapter);
    

    湾在layout文件夹中,创建customizelistitem.xml

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
        android:id="@+id/customizedlistitem"   
        android:layout_width="match_parent"   
        android:layout_height="wrap_content"
        android:background="@drawable/customizedbackground"/>   
    

    ℃。在drawable文件夹中,创建custombackground.xml,如下所示:

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/RED"></item>
        <item android:state_pressed="true" android:drawable="@color/GREEN"></item>      
        <item android:drawable="@color/BLACK"></item>   <!-- for other state -->        
    </selector>
    

    d。确保项目中定义了颜色RED,GREEN和BLACK(您可以在values文件夹下的color.xml中定义它):

    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>  
         <color name="RED">#FF0000</color>
         <color name="GREEN">#008000</color>
         <color name="BLACK">#000000</color>
    </resources>
    

答案 1 :(得分:2)

试试这个,它会起作用 -

myList.getChildAt(myList.getSelectedItemPosition()).setBackgroundColor(Color.RED);

答案 2 :(得分:1)

xml文件中的ListView:

<ListView android:id="@+id/android:list" android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_below="@+id/Tablayoutdesign"
        android:cacheColorHint="#000000"
        android:dividerHeight="1dip"
        android:layout_marginTop="63dip"
        android:layout_marginBottom="40dip"

        />

使用listselector名称创建新的xml,如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <!-- Selected --> 
  <item 
    android:state_focused="true" 
    android:state_selected="false" 
    android:drawable="@drawable/focused"/> 

  <!-- Pressed -->
  <item 
    android:state_selected="true" 
    android:state_focused="false"
    android:drawable="@drawable/selected" /> 

</selector>

创建colors.xml文件,如:

<resources>
    <drawable name="focused">#ff5500</drawable>
    <drawable name="selected">#FF00FF</drawable>
</resources>

在你的java代码中:

ListView lv= (ListView) findViewById(R.id.list);
lv.setSelector( R.drawable.listselector);

答案 3 :(得分:0)

可能最简单的方法是使用State List Drawable作为背景。这使您可以应用不同的样式,具体取决于是否选择/聚焦/禁用/等等。

有关State List Drawables的介绍,请查看this article

答案 4 :(得分:0)

更改行

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);

myList.getSelectedView().setBackgroundColor(getResources().getColor(Color.RED));

答案 5 :(得分:0)

我尝试了以下方式并解决了问题。

创建一个接收位置的 javaBean 类。喜欢以下。

public class Global {

    public static int mListPosition = 0;

    public static int getListPosition() {
        return mListPosition;
    }

    public static void setListPosition(int mListPosition) {
        Global.mListPosition = mListPosition;
    }
}

然后从OnListItemClickListener()我设置所选项目的位置。喜欢以下

mList.setOnItemClickListener(new OnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Global.setListPosition(arg2);                   
    }
});

然后在适配器类中执行以下操作

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) mCtx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.details_retailer_list_row, null);

        mHolder = new ViewHolder();
        v.setTag(mHolder);

        mHolder.mDetailsRetailerLayout = (LinearLayout) v
                .findViewById(R.id.details_cart_retailer_row_layout);
        mHolder.mDetailsRetailer = (TextView) v
                .findViewById(R.id.detailsRetailerRow);

    } else {
        mHolder = (ViewHolder) v.getTag();
    }

    final CartDetailsRetailerBean mDetailsRetailerBean = mItems
            .get(position);
    if (position == Global.getListPosition()) {
        mHolder.mDetailsRetailerLayout
                .setBackgroundResource(R.drawable.image1);
    } else {
        mHolder.mDetailsRetailerLayout
                .setBackgroundResource(R.drawable.image2);
    }

    if (mDetailsRetailerBean != null) {
        Log.i("Global Position", "" + Global.getListPosition());
        mHolder.mDetailsRetailer.setText(mDetailsRetailerBean
                .getRetailerName());
    }
    return v;
}    

尝试使用此选项更改Android列表视图中的选定行背景颜色更改。

答案 6 :(得分:0)

nullPointerException可能是因为你处于touchmode状态,当你处于触摸模式时,setSelection并没有真正选择listView上的项目,它只是“看”了它,如果你知道我的意思。

你必须做一个自定义的适配器(通过创建一个扩展你当前正在使用的适配器的类:])

在您的自定义适配器类中,您必须覆盖getView(int position,View convertView,ViewGroup parent)方法,如下所示:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
        convertView = inflater.inflate(android.R.layout.simple_list_item_1, null);
    String content = lista.get(position).toString();
    TextView text = (TextView) convertView.findViewById(android.R.id.text1);
    text.setText(content);
    convertView.setBackgroundColor(lista.get(position).getBackgroundColor());
    return convertView;
}

在代码中,变量“lista”是我在适配器上的一些项目的列表。

因此,当您完成选择项目时,您必须为您拥有的每个项目调用getView,或者您可以从listView 调用方法invalidateViews 之前设置选择(如果您选择后调用invalidateViews,将忽略选择(至少在touchmode:]上)