【问题标题】:Listview Onclick Listener Not working after updating Cardview LayoutListview Onclick 监听器在更新 Cardview 布局后不工作
【发布时间】:2016-12-24 21:32:01
【问题描述】:

当我使用带有 ImageViews 的旧布局时,我已经更新了布局,将 ImageViews 替换为 Buttons,并且 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();
    }
}

【问题讨论】:

  • 在 StackOverflow 中不允许有代码链接。如果您通过编辑问题包含代码,您可能会获得更好的体验。您还应该考虑这里写的 How do I ask a good question? 尤其是标题为帮助他人重现问题的部分
  • @MileT 抱歉,我从来不知道,我会用实际代码更新问题。
  • 是的,请 - 外部链接可以作为支持信息,但相关位也需要在问题本身中,以可读的方式格式化。其原因是,根据我们的经验,外部链接经常断开,使问题(和任何答案)处于断开状态。此时必须将其删除以保持网站质量水平。
  • (如果您修复了问题并且该问题已被搁置,请使用@halfer 联系我,我会考虑重新投票)。
  • @halfer,我已经尝试了几次添加代码,但我一直抛出错误,代码中存在格式错误,因此我无法更新问题,我会尝试现在再次解决这个问题,希望我能正确格式化并更新。

标签: java android xml android-layout


【解决方案1】:

存在观点冲突的问题,即观点可能会被其他人重叠,所以添加

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

【讨论】:

  • 很高兴帮助好友:)
  • 我可以标记你,以便将来有任何其他问题吗?
  • @FayazAralikatti 是的,当然:)
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:
    • 第 1 步:在 list_item.xml 中,将 android:descendantFocusability="blocksDescendants" 添加到您的根目录 Linearlayout

    • 第 2 步:在 list_item.xml 中,将 android: focusable="false" 添加到 android.support.v7.widget.CardView

    注意:如果android.support.v7.widget.CardView中有android:clickable="true",请删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      相关资源
      最近更新 更多