安卓:Activity中的onListItemClick

11

上次我在这里问问题的时候,学到了很多东西,所以我想再试一次。

我正在使用来自以下链接的Fedor的懒加载列表: ListView中的图像懒加载

它起作用非常好。但是,Fedor将他的主类扩展为Activity而不是ListActivity。因此,我无法再使用listItemClick监听器。当我转换它时,Eclipse会在onListItemClick()周围声明一些错误。

    @Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
     // Intent launcher here
}

转换成

   protected void onListItemClick(ListView l, View v, int position, long id) {
     // Intent launcher here
   }

但是意图启动器不起作用,Toast 通知也不起作用。

当我将 Activity 转换为 ListActivity 时,Eclipse 不会出错,但我的仿真器会强制关闭。

如何获得

  • 要么在活动中使用 onListItemClick() 点击(优选)
  • 或者我应该如何将代码转换为 ListActivity,以避免强制关闭?

提前感谢。

8个回答

30
一个listItemClickListener被附加到一个ListView上。当你将ListActivity更改为Activity时,你的类不再与视图相关联,因此Activity类不知道如何处理onListItemClickListener。
你只需要将一个监听器附加到你的ListView即可:
listview.setOnItemClickListener(new OnItemClickListener(){
    @Override
    protected void onListItemClick(AdapterView<?> parent, View view, int position, long id){
        //Do stuff
    }
});

1
哇!我大约晚了一年半才加入懒加载的行列,而你仍然是我的救星... :-) - Siddharth Lele

1

我一整天都在处理这个问题,自己编写了ArrayAdapter后,我无法弄清楚如何在列表中更改类。

以下是我发现如何实现的方法。在调用我的数组后,我只需在该方法中完成我的代码即可。

ListView lv =getListView();
lv.setOnItemClickListener(this);

然后在我的所有文本之后,我放置了

public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long arg3) {
    String item = (String) getListAdapter().getItem(position);

    if (item.equals("Economy"))
    {
        Intent intent = new Intent(packages.this, economy.class);
        startActivity(intent);
    }
    else if (item.equals("Basic"))
    {
        Intent intent = new Intent(packages.this, basic.class);
        startActivity(intent);
    }
    else if (item.equals("Professional"))
    {
        Intent intent = new Intent(packages.this, professional.class);
        startActivity(intent);
    }
    else if (item.equals("Custom Applications"))
    {
        Intent intent = new Intent(packages.this, applications.class);
        startActivity(intent);
    }
}

在这之间,我成功地使用自定义字体和背景完全定制了我的ListView。我知道很多人可能并不关心,但我感到非常兴奋,并希望通过发布这篇文章能够帮助未来的某个人。


1

对于非ListActivity来说,要为ListView设置一个项点击监听器,你需要在ListView上调用setOnItemClickListener()(如果它是从XML中获取的,则可能需要使用findViewById()获取它)。

与其仅仅覆盖ListActivityonListItemClickListener(),在这里,您可以让您的调用Activity实现AdapterView.onItemClickListener()并将其作为参数传递给setOnItemClickListener()

(如果您阅读ListActivity的源代码(我建议这样做),您会看到它在幕后通过创建一个内部监听器对象来调用您重写的onListItemClick()来实现这一点。)


1
我将我的答案写成了:

1)@Falmarri的代码需要更新
2)我的建议编辑被完全拒绝了 XD
3)Stackoverflow不允许我写评论。

这是代码:
ListView listView = (ListView) findViewById(R.id.my_listview_in_layout);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        //Do stuff
        //...
    }
});


参考: 根据 android.widget.AdapterView.OnItemClickListener ,当项目被点击时,公共方法onItemClick()将被调用 {而不是未知的受保护方法onListItemClick() }


0
如果您正在使用 ListActivity,那么您需要像这样做:
public class YourClass extends ListActivity implements OnItemClickListener{

    @Override
    public void onCreate(Bundle icicle){
        super.onCreate(icicle);
        setContentView(R.layout.your_layout);

        getListView().setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // your stuff here
    }
}

这不是设置 OnItemClickListener 的唯一方式。查看其他答案。我喜欢这种方式,因为它更清晰、更易于阅读。


这样做就可以了。非常感谢!这显然也适用于普通的活动。 - Vic V
1
这是什么?天哪,不要这样做。如果你正在扩展ListActivity,你不需要监听onItemClickListener。而如果你正在扩展ActivityOnItemClickListener并不适用于所有的活动,所以你不应该将其实现到活动中。 - Falmarri
1
我不是很明白。为什么需要应用到所有的活动中呢?我只想把它应用到一个列表上。 - Vic V
@Falmarri 我不明白你的意思。"如果你正在扩展Activity,OnItemClickListener并不适用于所有Activity,因此你不应该将其实现到Activity中" 当然,它并不适用于所有Activity,这正是我们所期望的。 - Cristian
啊...我明白了...在那种情况下创建匿名内部类(就像你在答案中所做的那样,以及当事件触发很简单时我总是这样做)也不好。遵循面向对象的原则,更好的方法是创建一个单独的类来处理事件。你知道,有很多原则指向这个方向(比如说“将会改变的事物与不会改变的事物分开”或者“在相互交互的对象之间努力实现松耦合设计”等),这甚至是MVC的基础。 - Cristian
显示剩余2条评论

0
假设您有一个包含几个字符串的数据源Fruit。您可以定义onCreate()如下:
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_fruit,
                FRUITS)); // context is this, style is list_fruit, Context, ,data_binding to FRUITs

然后编写以下代码的 onListItemClick()

protected void onListItemClick(ListView parent, View v, int position, long id) {
                Toast.makeText(this,  " You selected  " + FRUITS[position], Toast.LENGTH_SHORT).show();
        }

希望它对你有用 :)


0
我只是在 onCreate() 中添加了以下内容:
    listvview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            setPaymentDetails();
        }
    });

onCreate()之外添加了setPaymentDetails()

protected void setPaymentDetails()
{
    Intent intent = new Intent(this, SetPaymentDetailsActivity.class);
    startActivity(intent);
}

0

FE.java

package com.example.rfe;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class FE extends ListActivity {
 public List<String> d = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.file);
        d = new ArrayList<String>();    
        Scanner in = null;
        File f = new File("/sdcard/input.txt");
        try
        {
        in = new Scanner(new FileReader(f));
        while(in.hasNext()==true)
        {
            d.add(in.nextLine());   
        }
        }catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }
        ArrayAdapter<String> fileList =
                  new ArrayAdapter<String>(this, R.layout.row, d);
                 setListAdapter(fileList);
    }
 @Override
 protected void onListItemClick(ListView l, View v, int position, long id) 
 {
     String selection = l.getItemAtPosition(position).toString();
     Toast.makeText(this, selection, Toast.LENGTH_LONG).show();
    super.onListItemClick(l, v, position, id);
}
}

这段代码可以运行,我花了很长时间才弄明白它,它可能对某些人有帮助。你需要两个XML文件,一个是file,另一个是row。 - ares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接