1

发生了什么我有一个列表视图,我将背景颜色更改为选择。默认情况下,我将第一个列表视图项目选为

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>

所以默认情况下,第一个列表视图被选中。现在当用户选择另一个列表视图项目时,第一个保持选中状态,另一个也得到相同的效果。那么如何动态改变点击列表视图项目的效果。意味着默认情况下,当用户选择其他项目时,第一个项目被选中,其他项目被选中,默认的效果被删除

4

4 回答 4

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在完成第三步后删除您的代码并输入以下代码。

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);

这将根据selector您在可绘制目录中定义的选择行项目。

ls.setItemChecked(0, true);

这将在第一次运行时默认选择第一项。之后,您可以通过单击其他项目来选择它们。

于 2013-08-12T12:03:33.097 回答
0

您可以为单击的项目声明一个 int,默认为开始单击的第一个项目,然后在 onclick 中相应地更新。

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 以反映新选择的项目。

于 2013-08-07T13:40:03.463 回答
0

你可以这样尝试:

在将 ListView 的适配器设置为 0 以进行默认选择后,即listView.setSelection(0);onItemClick您获得项目的选定位置(第 3 个参数)后,在 onItemClick 中写入listView.setSelection("that 3rd param");

于 2013-08-08T07:36:25.950 回答
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); }

}
于 2013-08-12T05:50:58.570 回答