我有一个列表视图,显示了几个项目。现在我想滚动到一些特定项目(例如第33项)。我知道这可以通过
完成myList.setSelection(32);
但是在UI上,该项目没有收到任何突出显示(因为它处于触摸模式?!)。如何为此项目应用特定背景颜色?我试过了
myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);
但是我得到一个NullPointerException,因为getSelectedView()返回null。有没有办法实现这个突出显示?我必须以某种方式通知用户哪个项目是“活动的”...
答案 0 :(得分: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:]上)