发生了什么我有一个listview,我在其中选择了背景颜色。默认情况下,我将第一个listview项目选为
public class OneWayFlightResult extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public OneWayFlightResult(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.row, null);
TextView flightTime = (TextView)vi.findViewById(R.id.flightTime); // title
TextView flightCompanyName = (TextView)vi.findViewById(R.id.flightCompanyName); // title
TextView flightNumber = (TextView)vi.findViewById(R.id.flightNumber); // title
ImageView flightLogo = (ImageView)vi.findViewById(R.id.flightLogo);
HashMap<String, String> flight = new HashMap<String, String>();
flight = data.get(position);
flightTime.setText(flight.get(TestActivity.FlightTime));
flightCompanyName.setText(TestActivity.FlightCompanyName);
flightNumber.setText(TestActivity.FlightNumber);
if(position == 0){
vi.setBackgroundResource(R.drawable.selection_effect);
vi.setSelected(true);
}
return vi;
}
这是我在 selection_effect.xml
中使用的XML文件<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<item>
<shape>
<solid android:color="#00a7eb" />
</shape>
</item>
</selector>
所以默认情况下,这会选择第一个列表视图。现在,当用户选择另一个列表视图项时,第一个列表视图保持被选中而另一个也获得相同的效果。那么如何更改listview项目点击的效果动态。默认情况下,当用户选择其他项目时,首选项目会被选中,其中一项被选中,默认情况下的效果会被删除
答案 0 :(得分:3)
我找到了解决问题的方法。请执行以下操作。
1)打开您已创建 ListView 的主要布局文件
添加android:choiceMode="singleChoice"
。这将如下所示。
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:choiceMode="singleChoice" >
</ListView>
2)打开 list_item.xml 布局文件。其中,在您的根视图中,添加android:background="?android:attr/activatedBackgroundIndicator"
。在我的示例项目中,它看起来如下所示。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/activatedBackgroundIndicator"
android:orientation="vertical" >
//your views
</LinearLayout>
3)打开您的活动文件。将适配器设置为ListView
后,添加list.setSelector(R.drawable.selection_effect);
。这将如下所示。
ListView ls = (ListView) findViewById(R.id.listView1);
ListAdapter adapter = new ListAdapter(this, data);
ls.setAdapter(adapter);
ls.setSelector(R.drawable.selection_effect);
此处,selection_effect
是您在drawable
目录中创建的可绘制文件。
我测试了我的代码。哪个工作正常。
4)要默认选择第一个视图,请在BaseAdapter
中删除您的代码,并在完成第3步后放入以下代码。
ls.setItemChecked(0,true);
你需要把它放在上面的代码之后。
ListAdapter adapter = new ListAdapter(data);
ls.setAdapter(adapter);
ls.setSelector(R.drawable.selection_effect);
ls.setItemChecked(0, true);
<强>解释强>
ls.setSelector(R.drawable.selection_effect);
这将根据您在drawable目录中定义的selector
选择行项目。
ls.setItemChecked(0,true);
这将在首次运行时默认选择第一项。您可以通过单击选择其他项目。
答案 1 :(得分:0)
你可以为单击的项声明一个int,默认为开始点击的第一个项目,然后在onclick update中相应地更新。
int selected = <default>;
设置oncreate等。
然后你可以拥有onItemClicked监听器并执行此操作,
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (selected != i){
<listView>.getChildAt(selected).setBackgroundColor(getResources().getColor(android.R.color.background_dark));
<listView>.getChildAt(i).setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));
selected = i;
}
}
这会将之前所选项目的背景颜色更改为(在我的情况下)默认的android黑暗主题颜色,将新选择的一个设置为漂亮的突出显示浅蓝色,并更新选定的int以反映新选择的项目
答案 2 :(得分:0)
您可以尝试这样:
将ListView设置位置的适配器设置为0以进行默认选择,即listView.setSelection(0);
,并在onItemClick
中获取项目的选定位置(第3个参数),因此在onItemClick中写入listView.setSelection("that 3rd param");
答案 3 :(得分:0)
我遇到类似ListView的问题你所做的就是点击项目时调用适配器上的方法,adadpter.SetPosition(position) {mSelectedPsoiton = position; notifyDataSetChanged();}
,并在你的getView函数中检查位置是否等于selectedPosition,然后相应地设置背景失败,焦点无法作为你的触摸模式总是
//adapter class
public override View GetView(int position, View convertView, ViewGroup parent) { TextView view = null; int lookupPos = position; if (null == convertView) { view = new TextView(_context); view.SetTextSize(ComplexUnitType.Sp, 20); view.SetPadding(_pixels, _pixels, _pixels, _pixels); } else { view = convertView as TextView; }
if (position == mSelectedPos )
{
view.SetBackgroundResource(Android.Resource.Color.HoloBlueDark);
}
else
{
view.SetBackgroundResource(Resource.Drawable.listItemSelector);
}
return view;
}
public void SetSelectedPosition(int position) { mSelectedPos = position;
}
private int mSelectedPos = -1;
// ListView code, _adapter is adapter of listview
listView.SetOnItemClickListener (new OnItemClickListener() { @Override public void onItemClick(AdapterView adapter, View view, int pos, long id) { _adapter.SetSelectionPostion(pos); }
}
答案 4 :(得分:0)
有一个简单的方法可以做到这一点。适配器类中的getView()方法内部使用以下代码。
MyListViewItem.super.notifyDataSetChanged();
确保在调用之前设置适配器数据类的值更改。这将刷新所有列表视图项。