在android中取消选择ListView项目onClick

时间:2013-08-07 12:44:04

标签: android android-layout android-listview

发生了什么我有一个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项目点击的效果动态。默认情况下,当用户选择其他项目时,首选项目会被选中,其中一项被选中,默认情况下的效果会被删除

5 个答案:

答案 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();


确保在调用之前设置适配器数据类的值更改。这将刷新所有列表视图项。