如何自动更改ListView中的选定项?

时间:2015-02-04 14:43:47

标签: android android-listview selection

我有一个ListView,其中包含一些用户可以选择的项目。

我希望第一个元素显示为选中状态,并且在1或2秒后,所选项目将自动成为第二个元素。

我该怎么做?

选择项目时,例如可以使用粗体文本。

我有一个ListView的自定义适配器。


更新

listview.setSelection(1);
System.out.println(listview.getSelectedItemPosition());

我用这个println测试了代码,但它返回“-1”。不选择任何行。

5 个答案:

答案 0 :(得分:1)

有关ListView的精彩教程,请参阅本教程:http://www.vogella.com/tutorials/AndroidListView/article.html

返回原始问题以选择项目使用以下内容:

 ListView.setSelection(int); 

调用只会在没有用户直接输入的情况下更改UI。

对于延迟,您可以使用以下代码段:

final Handler handler = new Handler(Looper.getMainLooper());

handler.postDelayed(new Runnable() {
   @Override
   public void run() {
        ListView.setSelection(int); 
   }
}, 100);

有关如何更改所选项目的Android ListView背景颜色的信息,请参阅此post

答案 1 :(得分:0)

如果您要求遍历列表并更改它的选择器,您可以使用这样的处理程序:

private Handler handler = new Handler();

private Runnable runnable = new Runnable() {
    @Override public void run() {
        int currentSelectedIndex = mListView.getSelectedItemPosition();
        if ((currentSelectedIndex + 1) < listCount) {
            mListView.setSelection(currentSelectedIndex + 1);
        } else {
            mListView.setSelection(0);
        }
        handler.postDelayed(runnable, 1000);
    }
};

然后在你的代码中,在onCreate()中调用例如:

handler.postDelayed(runnable, 1000);

这将根据您的需要每秒更改列表选择。

如果您确实要停止自动列表选择器,请调用:

handler.removeCallbacks(runnable);

答案 2 :(得分:0)

在没有直接用户输入的情况下自动更改UI会被视为不良用户体验,但如果要以编程方式选择ListView中的项目,则可以调用

ListView.setSelection(int);

  

设置当前选定的项目。如果处于触摸模式,则该项目不会   被选中但仍然会被恰当地定位。如果   指定的选择位置小于0,然后是项目的位置   将选择0。

对于延迟,您需要将其置于处理程序中。

public class ListLooper {

    private LoopHandler mHandler;
    private ListView mListView;

    public ListLooper(Activity activity) {
        mListView = new ListView(activity);
        mHandler = new LoopHandler(mListView);
    }

    private void start() {
        mHandler.sendEmptyMessageDelayed(LoopHandler.MSG_LOOP, LoopHandler.DELAY);
    }

    private void stop() {
        mHandler.removeMessages(LoopHandler.MSG_LOOP);
    }

    private static class LoopHandler extends Handler {

        private static final int MSG_LOOP = 1;
        private static final int DELAY = 2000;

        /**
         * Use a WeakReference so we don't keep an implicit reference to the Activity
         */
        private WeakReference<ListView> mListRef;
        private int mPosition;

        private LoopHandler(ListView list) {
            mListRef = new WeakReference<>(list);
        }

        @Override public void handleMessage(Message msg) {
            super.handleMessage(msg);

            // Check if we still have a reference to the ListView, and the Activity/Fragment hasn't been destroyed
            if (mListRef.get() == null) {
                return;
            }

            // If we're looping, run this code
            if (msg.what == MSG_LOOP) {
                int count = mListRef.get().getAdapter().getCount();

                mListRef.get().setSelection(mPosition);

                // If the position is less than the count, increment it, otherwise set it to 0
                if (mPosition < count - 1) {
                    mPosition++;
                } else {
                    mPosition = 0;
                }

                // Send the same message again, so we repeat this process
                sendEmptyMessageDelayed(MSG_LOOP, DELAY);
            }
    }
}

答案 3 :(得分:0)

非常感谢!

这条指令:

listview.setSelection(int)

在我的代码中不起作用。

当我选择某个项目时,背景颜色变为蓝色。这是对的。 但是当刚刚加载活动时,没有自动选择项目。

答案 4 :(得分:0)

我使用performItemClick并选中并突出显示该项,getSelectedItem方法将返回正确的值:

ListView1.performItemClick(ListView1.getChildAt(1),1,ListView1.getItemIdAtPosition(1));

其中1 =列表中的位置