java - Android ListView选中的项目保持突出显示

我有一个XML,有两个ListView,一个有一个客户列表,由一个选择查询填充(lv_cli),另一个有客户选择的详细信息(lv_cli_det)。我想在lv_cli中选择客户端,而lv_cli_det则显示详细信息。

XML:

android:id="@+id/cli_lista"

android:layout_width="512dp"

android:layout_height="wrap_content"

android:fadeScrollbars="false"

>

android:id="@+id/cli_lista_det"

android:layout_width="512dp"

android:layout_height="wrap_content"

android:layout_toRightOf="@+id/cli_lista"

android:fadeScrollbars="false" >

Java的:

Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null);

final ListView t = (ListView)findViewById(R.id.cli_lista);

ArrayAdapter myarrayAdapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, listItems);

t.setAdapter(myarrayAdapter);

final ListView td = (ListView)findViewById(R.id.cli_lista_detalhe);

final ArrayAdapter myarrayAdapter2 = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, listItems2);

t.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

String item = ((TextView)view).getText().toString();

String[] strArray = item.split("\\;");

cli.load(strArray[0].toString());

td.setAdapter(myarrayAdapter2);

listItems2.clear();

listItems2.add("Nome: " + cli.getNome());

listItems2.add("Morada: " + cli.getMorada());

listItems2.add("Localidade: " + cli.getLoca());

listItems2.add("Código Postal: " + cli.getCp());

listItems2.add("Pais: " + cli.getPais());

listItems2.add("Nif: " + cli.getNif());

listItems2.add("Tel: " + cli.getTel());

listItems2.add("Tlm: " + cli.getTlm());

listItems2.add("Tipo Preço: " + cli.getTipoPvn());

listItems2.add("Cond. Pagamento: " + cli.getCpg());

listItems2.add("Obs: " + cli.getObs());

td.setAdapter(myarrayAdapter2);

myarrayAdapter2.notifyDataSetChanged();

}

});

9个解决方案

152 votes

找到了正确的方法。 这很简单。在资源描述如下:

android:choiceMode="singleChoice"

android:listSelector="#666666"

(或者您可以指定资源链接而不是颜色值)

的程序化:

listView.setSelector(Drawable selector)

listView.setSelector(int resourceId)

listView.setChoiceMode(int mode)

模式可以是以下之一:AbsListView.CHOICE_MODE_SINGLE,AbsListView.CHOICE_MODE_MULTIPLE,AbsListView.CHOICE_MODE_NONE(默认)

(AbsListView是ListView类的抽象祖先)

附: 使用onItemClick进行操作并更改视图背景是破产的,因为视图本身是一个临时对象。 因此,您不得跟踪视图。

如果我们的列表足够长,则与滚动项相关联的视图将从层次结构中删除,并且将在再次显示这些项时重新创建(使用缓存的显示选项,例如背景)。 因此,我们跟踪的视图现在不是项目的实际视图,更改其背景对实际项目视图没有任何作用。 因此,我们选择了多个项目。

AJG answered 2019-05-26T09:47:19Z

126 votes

要在按下列表视图项时保持其颜色,请在列表视图项布局中包含以下行:

android:background="@drawable/bg_key"

然后在res/values/colors.xml文件夹中定义bg_key.xml,如下所示:

android:state_selected="true"

android:drawable="@color/pressed_color"/>

android:drawable="@color/default_color" />

最后,请将此内容包含在您的res/values/colors.xml onClickListener中:

listView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position,long arg3) {

view.setSelected(true);

... // Anything

}

});

这样,任何时候都只会选择一个项目进行颜色选择。 您可以在res/values/colors.xml中使用以下内容定义颜色值:

#4d90fe

#ffffff

Neoh answered 2019-05-26T09:46:07Z

35 votes

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> adapterView, View view, int i, long l) {

for (int j = 0; j < adapterView.getChildCount(); j++)

adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);

// change the background color of the selected element

view.setBackgroundColor(Color.LTGRAY);

});

也许您可能希望使用索引i将当前所选元素保存在全局变量中。

Chris623 answered 2019-05-26T09:47:46Z

11 votes

简单的方法是,如果您在xml中使用listview,请在listview上使用此属性,

android:choiceMode="singleChoice"

android:listSelector="#your color code"

如果不是通过编程方式使用xml

listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);

listview.setSelector(android.R.color.holo_blue_light);

Ashana.Jackol answered 2019-05-26T09:48:19Z

3 votes

你需要像这样的选择器:

然后将android:choiceMode="singleChoice"设置为ListView。

Крум Илиев answered 2019-05-26T09:48:52Z

2 votes

来自Avinash Kumar Pankaj的例子

View v;

然后在oncreate方法

v = new View(getActivity());

然后我写的onlistitemclick方法

public void onListItemClick(ListView listView, View view, int position,

long id) {

v.setBackgroundResource(0);

view.setBackgroundResource(R.color.green);

v = view;

}

它对我有用。 谢谢。

我换了

v = new View(getActivity());

v = new View(this);

并且代码运作良好。

前面的例子中的xml文件'colors'和'bg_key'也是必要的,以及ListView属性android:background =“@ drawable / bg_key”

毛罗

Mauro Simoes answered 2019-05-26T09:49:59Z

2 votes

*请确保列表视图容器的根布局中没有Ripple

将此行添加到列表视图中

android:listSelector="@drawable/background_listview"

这是“background_listview.xml”文件

background_listview.xml文件中使用的颜色:

#cc7e00

#ffffffff

在这之后

(单击项目包含橙色,直到您单击另一个项目)

ShahinFasihi answered 2019-05-26T09:50:58Z

1 votes

您可以这样做的一种方法是跟踪活动中当前选定的位置:

@Override

public void onItemClick(AdapterView> arg0, View arg1, int position,

long arg3) {

currentPosition = position

lv_cli.notifyDataSetChanged();

}

现在,请确保为列表项的父布局(linearLayout,boxLayout,relativeLayout,...,无论您喜欢什么)分配ID。

然后在ListView中你可以做这样的事情:

layoutBackground = (LinearLayout) convertView.findViewById(R.id.layout_background);

if (YourActivity.this.currentPosition == position) {

layoutBackground.setBackgroundColor(YourActivity.this.getResources().getColor(R.color.hilight_color));

} else{

layoutBackground.setBackgroundResource(R.drawable.list_item_drawable);

}

基本上,只需将hilight颜色设置为背景,当它等于当前所选位置时。请注意在未选择项目时如何设置可绘制的背景资源。 这可能与您的情况不同(因为您没有发布任何代码)。 在我的情况下,这个drawable是一个选择器,确保按下时项目高亮。

注意:这个简单的代码不使用视图持有者,但我真的   建议使用一个。

Tristan Vanderaerden answered 2019-05-26T09:51:54Z

0 votes

请改用id:

即使列表很长,这是最容易处理的方法:

public View getView(final int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

Holder holder=new Holder();

View rowView;

rowView = inflater.inflate(R.layout.list_item, null);

//Handle your items.

//StringHolder.mSelectedItem is a public static variable.

if(getItemId(position)==StringHolder.mSelectedItem){

rowView.setBackgroundColor(Color.LTGRAY);

}else{

rowView.setBackgroundColor(Color.TRANSPARENT);

}

return rowView;

}

然后在你的onclicklistener中:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> adapterView, View view, int i, long l) {

StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1);

catagoryAdapter.notifyDataSetChanged();

.....

Wasiun A. Khan answered 2019-05-26T09:52:34Z

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐