关于ListView代码

时间:2011-05-17 04:31:34

标签: android android-listview

我是Android的新手,现在我正在学习ListView

当我看到这段代码时,我正在阅读bogotobogo.com上的教程:

ListView lv = getListView();
            lv.setTextFilterEnabled(true);
            *** lv.setOnItemClickListener(new OnItemClickListener() {  
                public void onItemClick(AdapterView parent, View v,
                        int position, long id) {
                      // When clicked, show a toast with the TextView text
                    Toast.makeText(getApplicationContext(), ((TextView) v).getText(),
                    Toast.LENGTH_SHORT).show();
                }
            }); ***

我无法理解来自lv.setOnItemClickListener(new OnItemClickListener()的代码;这是一个争论吗?

有人可以帮我理解吗?

1 个答案:

答案 0 :(得分:1)

该代码正在执行的是内联实现新的OnItemClickListener。 OnItemClickListener接口基本上是一个契约,它表示对象将提供函数onItemClick(....)的实现。稍后,当单击列表中的项目时,将调用onItemClick函数和AdapterView(实例化和管理列表行的事物,视图 - (特定行的呈现代码),位置(位置)列表)和一个我从不使用的id属性,所以你可以查找传递的内容。

像这样的内联代码对我来说总是很奇怪。还有其他一些写这个的方法我认为更直观。请记住,您正在做的是编写一些代码,以便在单击列表中的行时执行。

1 - 您可以让您的Activity实现OnItemClickListener

public class SomeActivity extends Activity implements OnItemClickListener{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.yourview);

        ListView lv = (ListView)findViewById(R.id.listView);
        lv.setOnItemClickListener(this);
    } 

    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
        //Your toast code goes in here
    }
}

在这段代码中,您的主类实现了OnItemClickListener接口,因此setOnItemClickListener将主类(this)视为OnItemClickListener的一个实例。单击列表中的行时,将调用onItemClick函数。

您也可以2 - 让您的点击监听器来自内部类。

public class SomeActivity extends Activity implements OnItemClickListener{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.yourview);

        ListView lv = (ListView)findViewById(R.id.listView);
        lv.setOnItemClickListener(new YourInternalClass());
    } 


    class YourInternalClass implements View.OnItemClickListener{
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
            //Your toast code goes in here
        }
    }
}

实际上所有三种方法都在做同样的事情:为setOnItemClickListener提供一个View.OnItemClickListener类的实例,该类将在单击列表中的行时调用onItemClick函数。