【问题标题】:Set a listener for a button within a ListView (without having the getView method ?)为 ListView 中的按钮设置侦听器(没有 getView 方法?)
【发布时间】:2013-03-24 21:31:26
【问题描述】:

我的应用程序中有一个 Listview 显示数据库中的内容。这是一个自定义的可点击列表视图,我想为列表视图的每个元素添加一个按钮,因此当您单击此按钮时,它将拨打电话并拨打特定号码。

我已经阅读了一些类似的主题,但都提到了适配器中的“getView”方法,但我不知道它指的是什么。这是我的列表视图的相关代码:

private void displayListView() {

    // getExtra
    Bundle bundle = getIntent().getExtras();
    String title = bundle.getString("title", "Choose here :");
    String inInterval = bundle.getString("inInterval");
    Log.d(TAG, "inInterval = " + inInterval);

    poititle.setText(title);


    // put the results of the method in a cursor
    Cursor c = dbHelper.findPoiInTable(inInterval);

    String[] columns = new String[] { DatabaseAdapter.COL_NAME,
            DatabaseAdapter.COL_STREET, DatabaseAdapter.COL_WEBSITE,
            DatabaseAdapter.COL_TELEPHONE, DatabaseAdapter.COL_REMARKS,
            DatabaseAdapter.COL_PRICE };

    int[] to = new int[] { R.id.name, R.id.street, R.id.website,
            R.id.telephone, R.id.remarks, R.id.price };

    cursorAdapter = new SimpleCursorAdapter(this, R.layout.poi_info, c,
            columns, to, 0);

    ListView listView = (ListView) findViewById(R.id.poilistview);
    // Assign adapter to ListView
    listView.setAdapter(cursorAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        // Comportement des éléments de la listview
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Intent i = new Intent(getApplicationContext(),
                    POIActivity.class);

            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String website = ((TextView) view.findViewById(R.id.website))
                    .getText().toString();
            String telephone = ((TextView) view
                    .findViewById(R.id.telephone)).getText().toString();
            String remarks = ((TextView) view.findViewById(R.id.remarks))
                    .getText().toString();
            String price = ((TextView) view.findViewById(R.id.price))
                    .getText().toString();
            // i.putExtra(ID_EXTRA, name) ;
            i.putExtra(ID_NAME, name);
            i.putExtra(ID_WEBSITE, website);
            i.putExtra(ID_TELEPHONE, telephone);
            i.putExtra(ID_REMARKS, remarks);
            i.putExtra(ID_PRICE, price);
            startActivity(i);


        }

    }); }

这是我在 XML 文件中的按钮定义:

<Button
    android:id="@+id/callButton"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_centerVertical="true"
    android:layout_marginRight="10dp"
    android:layout_toLeftOf="@+id/arrowImage"
    android:text=" Call "
    android:textSize="15sp" 
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:descendantFocusability="blocksDescendants" /> 

我当然尝试过设置监听器的常用方法(.setOnClickListener 等),但我想我的 displayListView() 方法确实必须做一些事情。
提前致谢!

【问题讨论】:

    标签: android listview button listener


    【解决方案1】:

    不使用getView 方法来设置按钮的点击是不可能的。 您需要了解如何使用适配器。 每个适配器都有一个名为getView 的方法,该方法将位置作为参数,适配器返回需要位于该位置的视图。 您需要覆盖SimpleCursorAdapter 及其getView 方法,并且在创建视图(R.layout.poi_info)时,您需要将点击监听器分配给按钮。 您现在所做的是在单击列表中的项目(而不是按钮)时触发您的侦听器。 无论如何,这是一个有很多讨论的主题,在谷歌中快速搜索可以给你答案。 这是我找到的一个教程: http://devtut.wordpress.com/2011/06/09/custom-arrayadapter-for-a-listview-android/

    祝你好运

    编辑 - 示例:

    请注意我在这里使用了newView。在您阅读有关适配器的更多信息后,请阅读有关 CursorAdapter 的信息,您将了解它是什么。此适配器的行为略有不同。

    public class ExtendedSimpleCursorAdapter extends SimpleCursorAdapter{
    
            public ExtendedSimpleCursorAdapter(Context context, int layout,
                    Cursor c, String[] from, int[] to, int flags) {
                super(context, layout, c, from, to, flags);
    
            }
    
            public View newView (Context context, Cursor cursor, ViewGroup parent){
                View v = super.newView(context, cursor, parent);
                v.findViewById(R.id.your_button_id).setOnClickListener(yourClickListener);
            }
        }
    

    【讨论】:

    • 感谢您的解释,然后我将进一步研究适配器。只是一个问题:到目前为止,我的代码运行良好,我可以用我的列表做我想做的一切(按钮监听器除外),每个元素都是可点击的并且行为正确。进行您建议的更改是否需要全部重写,添加新类?我已经使用了 SimpleCursorAdapter,是否可以将 getView 方法直接集成到我的代码中,或者整个逻辑是重新思考?谢谢=)
    • 不好意思,没看到是CursorAdapter,还以为是ArrayAdapter,不过差别不大。对于您的问题,不,新适配器不会改变您的任何逻辑。将适配器视为连接 UI 和您要呈现的数据(在您的情况下是来自数据库的数据)之间的东西。适配器获取数据并创建将在您的列表中的项目。 Android 提供了基本的适配器,您需要做的是扩展主题以供您使用。我在答案中添加了一个示例,说明您对适配器的更改可能是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多