我需要突出显示所选的ListView
中的一行(向用户显示他选择的内容),因此,这不是将要选择的那一行,而是他之前选择的那一行。< / p>
我已经拥有位置:
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();
}
});
}
}
答案 0 :(得分:37)
由于默认情况下ListViews
设置为NONE
的选择模式,因此在触摸模式下,setSelection
方法不会产生视觉效果。
为了保持先前的选择/可视化显示明确的选择,首先必须适当地设置列表视图的选择模式:
listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
阅读这些方法的API文档很有用:
void android.widget.AdapterView.setSelection(int position)
设置当前选定的项目。至 支持可访问性子类 覆盖此方法必须调用 首先覆盖超级方法。
<强>参数强>:
position
要选择的数据项的索引(从0开始)。
void android.widget.ListView.setChoiceMode(int choiceMode)
定义的选择行为 名单。默认情况下,列表没有 任何选择行为 (
CHOICE_MODE_NONE
)。通过设置 choiceMode为CHOICE_MODE_SINGLE
,. 列表最多允许一个项目在a中 选定的国家。通过设置 choiceMode为CHOICE_MODE_MULTIPLE
, 该列表允许任意数量的项目 被选中。参数:
choiceMode
CHOICE_MODE_NONE
之一,CHOICE_MODE_SINGLE
或CHOICE_MODE_MULTIPLE
如果这还不够(假设您希望始终在当前选择旁边显示最后一个选项),则应将最后选择的项目(填充ListAdapter
的数据)存储为{{ 1}},并且在适配器的lastSelectedItem
方法中,如果渲染器等于此getView
,则为渲染器分配不同的背景资源。
如果最后一次选择不会在选择更改时刷新,则应在适配器实例上显式调用lastSelectedItem
方法。
<强>更新强>
由于您的包含notifyDataSetChanged
的活动是等待此结果的活动的子项(基于ListView
部分),因此最初的想法是正确的,最后的位置应该通过意图传递开始活动:
setResult(Activity.RESULT_OK,pongIntent);
如果你保持同一个活动,selectedListItem = getIntent().getIntExtra("PositionInList", -1);
lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lvUsers.setSelection(selectedListItem);
解决方案会有效,但是你在每个itemClick(选择更改)上完成它,这就是额外数据应该传递给起始ListView.CHOICE_MODE_SINGLE
的原因。
您还可以在适配器中设置之前所选项目的背景 - 如上所述 - 覆盖其Intent
方法:
getView
答案 1 :(得分:27)
只需:
setChoiceMode
设置背景以支持项目布局中的选择状态,例如:
android:background="?android:attr/activatedBackgroundIndicator"
仅供参考:
答案 2 :(得分:14)
在布局文件中实现此功能要容易得多,让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()
和set/unset selected items accordingly。 Android将更改state_selector.xml文件中指定的背景颜色。
答案 3 :(得分:9)
我找到一个简单的解决方案时遇到了问题,因为很多教程和答案都包含有关单选通过单选按钮的信息(严重依赖于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));
}
}
答案 4 :(得分:4)
我通过以下方式解决了这个问题: 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);
}
}
答案 5 :(得分:1)
为什么不将选择存储在数组中,然后在ListView数组适配器的构造函数中传递该数组,如myArrayAdapter(context,layoutID,dataArray,selectionArray)
然后在arrayadapter的getView
方法中,进行检查。例如,在伪代码中
if row was previously selected
change background color
答案 6 :(得分:1)
您可以使用转场。按照我的代码,因为我已经选择突出显示特定的listview项目 让我们假设您要突出显示第一项,持续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 used here can be solid colors, gradients, shapes, images, etc. -->
<item android:drawable="@drawable/new_state" />
<item android:drawable="@drawable/original_state" />
</transition>
<强> new_state.xml 强>
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#92BCE7"/>
</shape>
<强> original_state.xml 强>
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/>
</shape>
如果您理解这个代码,我必须说这很简单,那么第零个位置的listview项目将以蓝色突出显示5秒钟,然后它会慢慢淡化为白色。
答案 7 :(得分:0)
所有
的简称View updatedview=null;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//these two lines of code means that only one item can be selected at a time
if(updatedview != null)
updatedview.setBackgroundColor(Color.TRANSPARENT);
updatedview=view;
Toast.makeText(getApplicationContext(), " " + str[position],Toast.LENGTH_LONG).show();
view.setBackgroundColor(Color.CYAN);
}