如何在Android中的ListView中突出显示行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android中的ListView中突出显示行?相关的知识,希望对你有一定的参考价值。
我需要在选中的ListView
中突出显示一行(向用户显示他选择的内容),因此,它不是将要选择的那一行,而是他之前选择的那一行。
我已经有了以下位置:
ListView.setSelection(position);
现在我想要的是选择这个特定的行并突出显示它。
包含onCreate()
的活动中ListView
的代码:
public class CountryView extends Activity
{
protected static final String LOG_TAG = null;
/** Called when the activity is first created. */
String[] lv_arr = {};
ListAdapter adapter;
TextView t;
private ListView lvUsers;
private ArrayList<Coun> mListUsers;
String responce=null;
public int d;
int selectedListItem = -1;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.country);
Intent data =getIntent();
mListUsers = getCoun();
lvUsers = (ListView) findViewById(R.id.counlistView);
lvUsers.setAdapter(new ListAdapter(this, R.id.counlistView, mListUsers));
selectedListItem=data.getExtras().getInt("PositionInList");
lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lvUsers.setOnItemClickListener(new OnItemClickListener()
{
int positionItem;
public void onItemClick(AdapterView<?> parent, View view,int position, long id)
{
Intent pongIntent = new Intent(getApplicationContext(),Trav.class);
int counId=mListUsers.get(position).id;
pongIntent.putExtra("response",mListUsers.get(position).p);
pongIntent.putExtra("responseCounID",counId);
//Put the position of the choose list inside extra
positionItem=position;
pongIntent.putExtra("PositionInListSet",positionItem);
setResult(Activity.RESULT_OK,pongIntent);
Log.i("CounID *******************************"," "+counId);
finish();
}
});
}
}
因为默认情况下ListViews
被设置为NONE
的选择模式,所以在触摸模式下setSelection
方法将没有视觉效果。
为了保持先前的选择/可视显示明确的选择,首先必须适当地设置列表视图的选择模式:
listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
阅读这些方法的API文档非常有用:
- 为setSelection
void android.widget.AdapterView.setSelection(int position)
设置当前选定的项目。要支持覆盖此方法的可访问性子类,必须首先调用overriden super方法。
参数: 要选择的数据项的
position
索引(从0开始)。
- 放在一边
void android.widget.ListView.setChoiceMode(int choiceMode)
定义List的选择行为。默认情况下,列表没有任何选择行为(
CHOICE_MODE_NONE
)。通过将choiceMode设置为CHOICE_MODE_SINGLE
,List允许最多一个项目处于选定状态。通过将choiceMode设置为CHOICE_MODE_MULTIPLE
,该列表允许选择任意数量的项目。参数:
choiceMode
CHOICE_MODE_NONE
,CHOICE_MODE_SINGLE
或CHOICE_MODE_MULTIPLE
之一
如果这还不够(假设您希望始终在当前选择旁边显示最后一个选项),则应将最后选择的项目(填充ListAdapter
的数据)存储为lastSelectedItem
,并在适配器的getView
方法中分配渲染器的不同背景资源,如果它等于此lastSelectedItem
。
如果您的最后一个选择不会在选择更改时刷新,则应在适配器实例上显式调用notifyDataSetChanged
方法。
更新
由于您的包含ListView
的活动是等待此结果的活动的子项(基于setResult(Activity.RESULT_OK,pongIntent);
部分),因此最初的想法是正确的,最后一个位置应该在启动活动时通过意图传递:
selectedListItem = getIntent().getIntExtra("PositionInList", -1);
lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lvUsers.setSelection(selectedListItem);
如果你保持相同的活动,ListView.CHOICE_MODE_SINGLE
解决方案将起作用,但你在每个itemClick(选择更改)上完成它,这就是为什么额外的数据应该传递给起始的Intent
。
您还可以从适配器设置先前所选项目的背景 - 如上所述 - 覆盖其getView
方法:
lvUsers.setAdapter(new ArrayAdapter(this, R.id.counlistView, groups)
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
final View renderer = super.getView(position, convertView, parent);
if (position == selectedListItem)
{
//TODO: set the proper selection color here:
renderer.setBackgroundResource(android.R.color.darker_gray);
}
return renderer;
}
});
只是:
- 在列表视图中设置正确的选择模式。
setChoiceMode
- 设置背景以支持项目布局中的选择状态,例如:
android:background="?android:attr/activatedBackgroundIndicator"
供参考:
- http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList
- http://android-developers.blogspot.mx/2008/12/touch-mode.html
在布局文件中实现这一点要容易得多,让Android处理剩下的...
1)确保在ListView布局(android:choiceMode=""
,singleChoice
等)上设置了multipleChoice
。默认情况下,它设置为none
。
<ListView
android:id="@+id/invite_friends_fragment_contacts_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="multipleChoice"/> <!-- THIS LINE -->
2)创建状态选择器XML文件并将其保存在drawables文件夹中。在这个例子中,我们将其命名为state_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/blue" android:state_selected="true"/>
<item android:drawable="@android:color/blue" android:state_activated="true"/>
<item android:drawable="@android:color/transparent"/>
</selector>
3)在列表项布局中,添加state_selector.xml文件作为背景:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/state_selector"> <!-- THIS LINE -->
<!-- ALL OF YOUR ELEMENTS WILL GO HERE (TextViews, ImageViews, etc) -->
</RelativeLayout>
如果你正在使用multipleChoice
,你可以覆盖onItemClick()
and set/unset selected items accordingly。 Android将更改state_selector.xml文件中指定的背景颜色。
我有一个问题找到一个简单的解决方案,因为这么多的教程和答案包含单选通过单选按钮的信息(严重依赖于RadioGroup)。
我的问题是我可以将项目设置为“突出显示”状态,但在选择下一个项目时无法重置列表。这是我想出的:
listView.setOnItemClickListener(new ItemHighlighterListener ());
有了这个课程:
private class ItemHighlighterListener implements OnItemClickListener{
private View lastSelectedView = null;
public void clearSelection()
{
if(lastSelectedView != null) lastSelectedView.setBackgroundColor(android.R.color.transparent);
}
@Override
public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
clearSelection();
lastSelectedView = view;
view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.shape_selected_menu_item));
}
}
我通过以下方式解决了这个问题:1。设置lastClickId,单击listView中的项目,将lastClickId更新为位置值,然后更新视图的背景。在此之后,当我们单击一个项目时,此项目将突出显示,但是当我们滚动listView(使我们从屏幕中选择的项目)并向后滚动时,突出显示消失,因为方法getView()重新运行你的适配器,所以,我们必须做下一件事。 2.在你的适配器中,改变方法getView()中的背景,这里是代码:
private static int lastClickId = -1;
private OnItemClickListener listener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
if ((lastClickId != -1) && (lastClickId != position)) {
parent.getChildAt(lastClickId).setBackgroundResource(
R.color.grey);
view.setBackgroundResource(R.color.blue);
}
if (lastClickId == -1) {
view.setBackgroundResource(R.color.blue);
}
lastClickId = position;
}
};
public static int getCurrentSelectedItemId() {
return lastClickId;
}
适配器:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = mInflater.inflate(R.layout.tweet_list_layout, null);
// set selected item's background to blue
if (position == MainUserFeedFragment.getCurrentSelectedItemId()) {
view.setBackgroundResource(R.color.blue);
}
}
为什么不将选择存储在数组中,然后在ListView数组适配器的构造函数中传递该数组,如myArrayAdapter(context,layoutID,dataArray,selectionArray)
然后在你的getView
方法中为arrayadapter做一个检查。例如在伪代码中
if row was previously selected
change background color
您可以使用转换。按照我的代码,因为我已经通过选择突出显示特定列表视图项目让我们想要突出显示第一项5秒。
if(position == 0){
viewHolderThubnail.relImage.setBackgroundResource(R.drawable.translate);
TransitionDrawable transition = (TransitionDrawable) viewHolderThubnail.relImage.getBackground();
transition.startTransition(1000);
}else{
viewHolderThubnail.relImage.setBackgroundResource(R.color.white);
}
translate.xml
<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The drawables use以上是关于如何在Android中的ListView中突出显示行?的主要内容,如果未能解决你的问题,请参考以下文章
如何取消 Android ListView 项目在 ListView 的 setOnItemClickListener 中被激活/突出显示?
Android - 单击后保持 ListView 的项目突出显示