57

我有两个片段。第一个内部带有按钮,另一个带有ListView内部(ListFragment)。

我希望第一个片段(感谢它的按钮)允许用户浏览第二个片段中的 ListView。

所以我希望 ListView 由第一个带有按钮的片段控制。

我在片段之间进行通信(将订单从第一个片段发送到第二个片段)没有问题,但我不知道如何告诉我的 ListView 选择(以编程方式)特定的列表项。

我应该使用哪种 ListView 以及如何告诉 ListView 选择/突出显示/聚焦其中一项?

当用户按下第一个片段的按钮时,我处于触摸模式。

我应该使用setFocusableInTouchMode(true)还是setChoiceMode(ListView.CHOICE_MODE_SINGLE)其他?

4

9 回答 9

143

这适用于所有试图:

-以编程方式选择 ListView 中的项目

-使该项目保持突出显示

我正在研究 Android ICS,我不知道它是否适用于所有级别的 Api。

首先创建一个列表视图(如果您已经在 listActivity/listFragment 中,则获取它)

然后将列表视图的选择模式设置为 single with :Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

然后以编程方式选择您的项目:(Mylistview.setItemChecked(position, true);位置是一个整数,表示要选择的项目的等级)

现在您的项目实际上已被选中,但您可能什么也看不到,因为选择没有视觉反馈。现在您有两个选择:您可以使用预构建的列表视图或自定义列表视图。

1)如果您想要一个预建的列表视图,请尝试simple_list_item_activated_1, simple_list_item_checked, simple_list_item_single_choice, 等...

您可以像这样设置您的列表视图,例如:setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

按照您选择的预建列表视图,您现在会看到,当您选中时,您会选中一个复选框或更改背景颜色等...

2)如果您使用自定义列表视图,那么您将定义将在每个项目中使用的自定义布局。在此 XML 布局中,您将为行中的每个部分视图指定一个选择器,选择时需要更改该选择器。

假设当您选择您的行时,您希望更改文本颜色和背景颜色。您的 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/menu_item_background_selector"
    android:orientation="horizontal" >

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textColor="@drawable/menu_item_text_selector" />

现在,在可绘制文件夹中创建 menu_item_background_selector.xml 和 menu_item_text_selector.xml。

menu_item_text_selector.xml :

 <?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_activated="true"
     android:color="#FFF">
</item>

<item android:state_pressed="true"
     android:color="#FFF">
</item>

<item android:state_pressed="false"
     android:color="#000">
</item>

</selector>

选择时文本将是白色的。

然后为你的背景做一些类似的事情:(记住你不是被迫使用颜色,但你也可以使用drawables)

menu_item_background_selector.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">


        <item android:state_activated="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="false"
        android:color="#ACD52B">
        </item>


      </selector>

此处,选中时背景为蓝色,未选中时为绿色。

我缺少的主要元素是android:state_activated. 确实(太多)状态:激活,按下,聚焦,检查,选择......

我不确定我给出的示例是否是最好android:state_activatedandroid:state_pressed最干净的示例,但它似乎对我有用。

但是我不需要创建自己的类来获得自定义 CheckableRelativeLayout(这很脏而且很可怕),也不需要使用 CheckableTextViews。我不知道为什么其他人使用这种方法,这可能取决于 Api 级别。

于 2012-05-28T23:05:03.143 回答
15

尝试AbsListView.performItemClick(...)

请参阅这篇文章了解如何使用performItemClick.

于 2013-04-22T11:54:18.030 回答
10

这对我有用:

1) 设置列表的选择行为。

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

2) 设置指定位置的选中状态。

mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter.

3) 在样式资源 (res/values) 中添加一个新样式,如下所示:

<style name="activated" parent="android:Theme.Holo">
<item name="android:background">@android:color/holo_green_light</item>
</style>

随意使用您喜欢的任何颜色。

4)在您的 ListView 中使用之前定义的样式:

<ListView
        android:id="@+id/listview"
        style="@style/activated"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"/>

或者在您用作行的布局中。

<?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="wrap_content" 
  style="@style/activated"
>
  <!--widgets for your row here-->

</LinearLayout>

希望对任何人都有帮助!

于 2015-10-17T05:48:58.737 回答
4

尝试mListView.setSelection(position);

于 2012-05-28T18:00:41.483 回答
4

杰西米的回答对我有用,除了一小部分。我想分享给其他人。调用list.setItemChecked( 0, true );FragmentActivity 的 onCreate() 不起作用。在getView()适配器list.getCheckedItemPosition( )返回 -1。

我必须从protected void onPostCreate( Bundle savedInstanceState ).

于 2014-12-24T06:20:14.163 回答
0

您可以使用ListView#setSelection(int)

于 2012-05-28T17:59:10.443 回答
0
package com.example.samsung;

import com.example.samsung.*;
import com.example.samsung.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

public class Firstscreen extends Activity implements OnItemSelectedListener {
    Button btn;
     Spinner sp;
     public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"};  


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_firstscreen);
        btn = (Button) findViewById(R.id.bn);
        sp= (Spinner) findViewById(R.id.sp);
    }
        public void button (View v){
            {

        Intent i = new Intent(Firstscreen.this,ML1676P.class);
        startActivity(i);
        }

        Spinner s1 = (Spinner) findViewById(R.id.sp);
        ArrayAdapter<String> adapter 
        = new ArrayAdapter<String>(this, 
                android.R.layout.simple_spinner_item, product); // find other layout parameters
        s1.setAdapter(adapter);
        s1.setOnItemSelectedListener(new OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }

    });
    }

    private Object product() {
            // TODO Auto-generated method stub
            return null;
        }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.firstscreen, menu);
        return true;
    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub


    }



}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Firstscreen"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FF35B5E5"
        android:layout_centerInParent="true"
        android:text="CHOOSE THE PRODUCT FROM THE LIST" />

    <Spinner
        android:id="@+id/sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:drawSelectorOnTop="true" />

    <Button
        android:id="@+id/bn"
        android:layout_width="285dp"
        android:layout_height="wrap_content"
        android:text="       GO             " 
        android:onClick="button"/>


</LinearLayout>

在列表视图中选择一个项目它应该在单击按钮时转到特定的选定项目页面如何操作。代码是上面的代码片段

于 2015-11-07T05:07:30.860 回答
0

我喜欢这样:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            try {
                int pos = 0;
                listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) );
            } catch (Exception e) {
                e.printStackTrace();
            }
        } 
    }
于 2016-08-04T11:01:57.047 回答
-1

只需将以下行添加到自定义列表视图的布局中:

android:background="?android:attr/activatedBackgroundIndicator"

有关完整的工作示例,请参见:

https://elimelec@bitbucket.org/elimelec/custombaseadapter.git

于 2014-07-12T02:17:23.707 回答