java - 更新 Cardview 布局后,Listview Onclick 监听器不工作

标签 java android xml android-layout

我已经更新了布局,将 ImageView 替换为已安装的按钮,当我将旧布局与 ImageView 一起使用时,Listview OnCLick 监听器现在无法正常工作。如果需要进一步正确格式化,请告诉我,我们将不胜感激。

Activity 中的监听器:

lvItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent intent = new Intent(MainActivity.this, ItemDetailsActivity.class);
        intent.putExtra("Position", position);
        startActivity(intent);
    }
});

list_item.xml:

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

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="16dp">

            <TextView
                android:id="@+id/ItemNametv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Item : "
                android:textSize="20sp"
                android:layout_marginBottom="8dp"/>

            <TextView
                android:id="@+id/qtytv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Qty : "
                android:layout_marginBottom="8dp"/>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#c0c0c0"
                android:layout_marginBottom="8dp"/>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/EditItem"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Edit"
                    android:minWidth="0dp"
                    android:minHeight="0dp"
                    style="@style/Widget.AppCompat.Button.Borderless"/>

                <Button
                    android:id="@+id/DeleteItem"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Delete"
                    android:textColor="@color/btn_logut_bg"
                    android:minWidth="0dp"
                    android:minHeight="0dp"
                    style="@style/Widget.AppCompat.Button.Borderless"/>

            </LinearLayout>

        </LinearLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

ItemDetailsAdapter.java:

public class ItemDetailsAdapter extends BaseAdapter {
    private ArrayList<Item> arrayListItem;
    private Context context;
    private LayoutInflater inflater;

    public ItemDetailsAdapter(Context context, ArrayList<Item> arrayListItem) {
        this.context = context;
        this.arrayListItem = arrayListItem;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return arrayListItem.size();
    }

    @Override
    public Object getItem(int position) {
        return arrayListItem.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        Holder holder;
        if (v == null) {
            v = inflater.inflate(R.layout.list_item, null);
            holder = new Holder();
            holder.ItemName = (TextView) v.findViewById(R.id.ItemNametv);
            holder.qty = (TextView) v.findViewById(R.id.qtytv);
            holder.EditItem = (Button) v.findViewById(R.id.EditItem);
            holder.DeleteItem = (Button) v.findViewById(R.id.DeleteItem);
            v.setTag(holder);
        } 
        else {
            holder = (Holder) v.getTag();
        }

        holder.ItemName.setText(arrayListItem.get(position).getItem());
        holder.qty.setText(arrayListItem.get(position).getQty());
        holder.EditItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context,AddOrUpdateItem.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("Position", position);
                context.getApplicationContext().startActivity(intent);
            }
        });
        holder.DeleteItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ShowConfirmDialog(context, position);
            }
        });
        return v;
    }

    class Holder {
        TextView ItemName, qty;
        Button DeleteItem, EditItem;
    }

    public static void ShowConfirmDialog(Context context, final int position) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
        alertDialogBuilder
            .setMessage("Are you sure you want to delete this entry?")
            .setCancelable(true)
            .setPositiveButton("YES", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    MainActivity.getInstance().deleteItem(position);
                }
            })
            .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
}

最佳答案

存在 View 冲突的问题,即 View 可能会被其他人覆盖,所以添加

android:descendantFocusability="blocksDescendants" 在您的父级布局和列表项上,对于您要处理点击事件的所有 View ,android:focusable="false" 像这里一样在按钮中添加这个...

关于java - 更新 Cardview 布局后,Listview Onclick 监听器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316964/

相关文章:

javascript - 是否可以更改 ExtLib 中应用程序布局控件中设置的预定义 Bootstrap 类

java - 将 VarHandle 转换为 java.lang.reflect.Field

java - 如何与设备通信?

java - Retrofit中如何迭代键值对

android - 数据库密码保护移动应用 iPhone/Android

java - 在 Android Studio v3.1.1 中生成构建 apk 时如何修复 checkReleaseBuilds false

xml - bsdtar文件分隔符字节?

java - 未找到 Java 类型的消息正文编写器 mime 类型 application/x-www-form-urlencoded

Delphi 的 Java 枚举方法

xml - 如何解决 "The download of the specified resource has failed"错误?