如何在Android中的ListView中突出显示行?

时间:2011-05-08 06:00:16

标签: android android-listview

我需要突出显示所选的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();
            }
         });
    }
}

8 个答案:

答案 0 :(得分:37)

由于默认情况下ListViews设置为NONE的选择模式,因此在触摸模式下,setSelection方法不会产生视觉效果。

为了保持先前的选择/可视化显示明确的选择,首先必须适当地设置列表视图的选择模式:

listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

阅读这些方法的API文档很有用:

  • 为setSelection
void android.widget.AdapterView.setSelection(int position)
     

设置当前选定的项目。至   支持可访问性子类   覆盖此方法必须调用   首先覆盖超级方法。

     

<强>参数
  position要选择的数据项的索引(从0开始)。

  • setChoiceMode
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)

只需:

  1. 在列表视图中设置正确的选择模式。 setChoiceMode
  2. 设置背景以支持项目布局中的选择状态,例如:

    android:background="?android:attr/activatedBackgroundIndicator"
    
  3. 仅供参考:

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