Android Gallery视图监听器添加延迟?

时间:2011-11-02 09:27:25

标签: android android-gallery

我已经实现了gallery和listview。 图库有图像,当我使用setOnItemSelectedListener点击图像时,Listview会更新,其中包含有关所选图像的信息。

问题:当我快速滚动浏览图库时,它会快速更新我的列表视图。但据我所知,listview应该等待画廊停止移动任何One图像,然后更新其内容。

任何人都知道如何在列表视图的更新之间添加时间或增加时间?请帮忙..

3 个答案:

答案 0 :(得分:3)

您可以尝试使用setOnItemClickListener。它只会在您实际“点击”图像时触发,而不仅仅是选择它。

    gallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            // Do what you want
        }
    });

更新

如果你想要一个带延迟的动作,而不是onItemClickListener实现,你有(至少)两个选择。一种是使用超时(Thread.sleep())运行单独的Thread,完成后,可以使用Handler更新活动状态。另一个选择是使用AsyncTask,这在技术上是相同的方法,它只将Runnable任务和Handler包装在一个内部类中。最简单的实现可能是这样的:

    ListUpdater listUpdater; 

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {

    // We have to run this thread to add delay before updating activity views
    if (listUpdater != null) { // Cancel previous task
        listUpdater.cancel(true);
    }
    if (listUpdater == null || position != listUpdater.getPosition()) {
        listUpdater = null;
        listUpdater = new ListUpdater(position);

        listUpdater.execute();
    }
}

class ListUpdater extends AsyncTask<String, String, String> {
    private int position;

    public int getPosition() {
        return position;
    }

    public ListUpdater(int position) {
        this.position = position;
    }

    @Override
    protected String doInBackground(String... params) { 
        try {
            Thread.sleep(600); // set delay time here
        } catch (InterruptedException e) {
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if (!isCancelled()) {
            // If another thread is not running, 
            //  that is if another item was not selected,
            //  update the activity 

            // Add code here to update the activity 
            // This method works in UI Thread, so you don't need to use Handler
            // For example:
            Toast.makeText(YourActivity.this, "" + position, Toast.LENGTH_SHORT).show();
        }
        super.onPostExecute(result);
    }
}

这是实现延迟的一个例子。没有必要精确满足您的需求,但您可以从中获得一些如何制作它的想法。

答案 1 :(得分:0)

不是实现setOnItemSelectedListener,而是实现OnItemClickListener:

  Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setAdapter(new ImageAdapter(this));

        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });

答案 2 :(得分:0)

在使用AsyncTask引用morphium的解决方案后我的工作了,但是,我发现多个调用者的问题(例如:OnHierachyChangeListener和OnItemSelectedListener)。第二个调用者将取消第一个任务,并且如果它们保持相同位置则不会启动新任务,导致第一个更新任务失败。

适用于

  1. 使用BaseAdapter的图库
  2. 在BaseAdapter内搜索(搜索项目)
  3. OnHierachyChangeListener(由Filter类添加/删除项目)
  4. OnItemSelectedListener(用户操作)
  5. 这是我的代码版本

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
    
        // We have to run this thread to add delay before updating activity views
        if (listUpdater != null) { // Cancel previous task
            listUpdater.cancel(true);
        } 
        listUpdater = new ListUpdater(position);
        listUpdater.execute();
    }
    

    我的代码只是停止上一个任务,并开始一个新任务,无论前一个和当前位置如何。为了安全起见,您还可以将其设为同步方法