处理 ListView 中的点击事件

Handling Click events within ListView

我创建了一个自定义 ListViewListView 包含关于每个对象的一些信息,以及 2 个按钮,用于编辑和删除。我已通过自定义 ListViewAdapter 将其附加到 ArrayList 对象以获取信息。

现在,我希望按钮在单击时更新 ArrayList 对象。我找不到办法做到这一点。我按照 link..

中的说明进行操作

http://www.migapro.com/click-events-listview-gridview/

程序没有抛出任何错误。但它也没有做任何事情。现在,我只想通过为每次单击按钮敬酒来进行测试。

ListViewAdapter.getView() 方法的代码是:

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    ViewHolder holder;

    // check if the view already exists
    // if so, no need to inflate and findViewById again!
    if (convertView == null) {

        // Inflate the custom row layout from your XML.
        convertView = mInflater.inflate(R.layout.list_item, null);

        // create a new "Holder" with subviews
        holder = new ViewHolder();
        holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name);
        holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry);

        // Taking care of the buttons
        holder.editButton = (Button) convertView.findViewById(R.id.button_edit);
        holder.editButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
            }
        });

        holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete);
        holder.deleteButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
            }
        });



        // hang onto this holder for future recycling
        convertView.setTag(holder);
    } else {

        // skip all the expensive inflation/findViewById
        // and just get the holder you already made
        holder = (ViewHolder) convertView.getTag();
    }
    // More code after this

    // Grab the title and author from the JSON
    String name = "";
    String expiry = "7 days";

    // Write appropriate codes to obtain values for the string variables above
    name = (String) getItem(position);

    // Send these Strings to the TextViews for display
    holder.itemNameView.setText(name);
    holder.itemExpiryView.setText(expiry);

    return convertView;
}

我在 MainActivity 中实现了 OnItemClickListener() 并编写了这个代码片段来处理按钮点击。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    long viewId = view.getId();

    if (viewId == R.id.button_edit) {
        Toast.makeText(this, "Edit Button CLicked", Toast.LENGTH_SHORT).show();
    } else if (viewId == R.id.button_delete) {
        Toast.makeText(this, "Delete Button CLicked", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(this, "ListView clicked" + id, Toast.LENGTH_SHORT).show();
    }
}

相应的布局文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

<TextView
    android:id="@+id/item_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/item_expiry"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/item_name" />

<Button
    android:id="@+id/button_edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/item_expiry"
    android:layout_alignParentLeft="true"
    android:text="Edit"
    android:clickable="true" />
    <!--android:onClick="editItem" />-->

<Button
    android:id="@+id/button_delete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/item_expiry"
    android:layout_alignParentRight="true"
    android:text="Delete"
    android:clickable="true" />
    <!--android:onClick="ItemEdits.deleteItem" />-->


</RelativeLayout>

如果你们需要更多代码片段,请告诉我。在 logcat 上找不到任何内容。因此,无法帮助处理任何错误 code/warning 消息。非常感谢。

我想在这里实现的是,当我点击Edit/Delete按钮时,我需要调用一个函数来修改存储列表值的ArrayList。并且不知何故,我需要传递单击项目的位置,以便我可以更新正确的信息。有更好的方法吗?如果是这样,请帮我提供一个代码示例。

您在 if(convertview == null) 中添加点击操作。这是需要改变尝试以下。这只是一个问题。试试这个,让我知道结果如何。

@Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        ViewHolder holder;

        // check if the view already exists
        // if so, no need to inflate and findViewById again!
        if (convertView == null) {

            // Inflate the custom row layout from your XML.
            convertView = mInflater.inflate(R.layout.list_item, null);

            // create a new "Holder" with subviews
            holder = new ViewHolder();
            holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name);
            holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry);

            // Taking care of the buttons
            holder.editButton = (Button) convertView.findViewById(R.id.button_edit);
            holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete);


            // hang onto this holder for future recycling
            convertView.setTag(holder);
        } else {

            // skip all the expensive inflation/findViewById
            // and just get the holder you already made
            holder = (ViewHolder) convertView.getTag();
        }

        holder.editButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
            }
        });

        holder.deleteButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
            }
        });

        // More code after this

        // Grab the title and author from the JSON
        String name = "";
        String expiry = "7 days";

        // Write appropriate codes to obtain values for the string variables above
        name = (String) getItem(position);

        // Send these Strings to the TextViews for display
        holder.itemNameView.setText(name);
        holder.itemExpiryView.setText(expiry);

        return convertView;
    }

注意:在 getView 方法中使用 onclick 或使用 onItemClick 方法。两者同时使用会产生一些问题。