我知道这听起来很简单,对此有疑问。但它都不能解决我的问题。所以我们走了:
我希望在用户点击时更改ListActivity
中列表项的背景颜色,并在用户再次点击时将其更改回原始颜色(即选择/取消选择项目类型)
我尝试使用getChildAt,如果我在一个屏幕上看到所有项目而不必滚动,它就能很好地工作。
代码:
getListView().getChildAt(position).setBackgroundColor(Color.CYAN);
当我在列表中有更多项目并且用户必须滚动它们时,问题就开始了。一旦项目的背景发生变化,当我滚动时,背景颜色会显示在新显示的项目上。此外,再次点击该项目时,getChildAt(position)
会返回null
(因此返回NullPointerException
)。
任何人都可以帮我一个简单的代码,帮助我改变列表项的背景颜色吗?
提前致谢!
答案 0 :(得分:5)
当然可以。我会在自定义getView()
的{{1}}方法中执行此操作。
ListAdapter
点击列表项时更新MyAdapter extends SimpleAdapter {
private ArrayList<Integer> coloredItems = new ArrayList<Integer>();
public MyAdapter(...) {
super(...);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (coloredItems.contains(position)) {
v.setBackgroundColor(Color.CYAN);
} else {
v.setBackgroundColor(Color.BLACK); //or whatever was original
}
return v;
}
}
。
coloredItems
答案 1 :(得分:2)
如果您正在处理ListFragment
,那么此代码将非常有用,
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (view != null) {
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);
catagoryValueListView=getListView();
catagoryValueListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (ColoredView != null)
ColoredView.setBackgroundColor(Color.WHITE); //original color
view.setBackgroundColor(Color.BLUE); //selected color
ColoredView = view;
}
});
}
}
答案 2 :(得分:1)
我所做的是创建一个名为list_background的xml文件并将其放在drawable文件夹中。
xml看起来像这样:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/list_selected" android:state_pressed="true" />
<item android:drawable="@android:color/white" />
</selector>
在ListView项目的xml代码中,我把这个xml作为项目背景,即
item.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Fill"
android:background="@drawable/list_background">
<!-- Your layout here -->
</RelativeLayout>
style = @ style / Fill只是我制作的捷径 android:layout_height =“match_parent”和android:layout_width =“match_parent
然后在onListItemCLick:
public void onListItemClick(ListView l, View v, int position, long id) {
v.setPressed( !v.isPressed ) //Toggle between colors of the view
}
答案 3 :(得分:1)
您只需在onListItemClick
方法
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
for (int a = 0; a < l.getChildCount(); a++) {
l.getChildAt(a).setBackgroundColor(Color.TRANSPARENT);
}
ColorDrawable colorDrawable1 = new ColorDrawable(
Color.parseColor("#A0A3A0"));
v.setBackgroundDrawable(colorDrawable1);
if (position == 0) {
Intent i = new Intent(MainActivity.this, NewActivity.class);
startActivity(i);
}
}
答案 4 :(得分:0)
这就是我做到的:
创建一个全局变量View ColoredView
;然后,当您setOnItemClickListener
ListView
时,请执行以下操作:
MenuList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (ColoredView != null)
ColoredView.setBackgroundColor(Color.WHITE); //original color
view.setBackgroundColor(Color.BLUE); //selected color
ColoredView = view;
}
});
这是我认为最简单的方法。
答案 5 :(得分:0)
谢谢heycosmo。你的解决方案解决了我的问题。
不知道为什么我们应该在2个地方设置背景。
<强> 1。适配器的getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
....
....
....
if(arrayBools[position]) {
view.setBackgroundColor(Common.colorBkgroundSelected);
}
else{
view.setBackgroundColor(Common.colorBkgroundNormal);
}
....
....
....
}
<强> 2。 ListActivity的onListItemClick()。
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
arrayBools[position] = ( arrayBools[position] ? false : true );
if(arrayBools[position]) {
v.setBackgroundColor(colorBkgroundSelected);
}
else{
v.setBackgroundColor(colorBkgroundNormal);
}
}