当我尝试在ListView中为一个按钮设置setOnClickListener时,我的应用程序因未知原因而崩溃

时间:2017-07-27 19:02:08

标签: android listview button

我正在使用ListView构建一个Contact应用程序。我的ListView有2个按钮。在这个应用程序中,为了测试按钮的响应能力,我打算设置按钮"编辑"所以,当我点击它时,它将变为"点击",然后按钮"删除"将改为" Clicked"。当我运行Debug时,应用程序停止工作,我无法再次使用它(在我添加onClickListener之前,这个应用程序已经工作了属性)。

我不知道错误是什么,并尝试了很多方法来修复。

这是我的row_listview.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:layout_margin="10dp">

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

    <ImageView
        android:id="@+id/imgAvatar"
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1"
        android:src="@drawable/if_male3_403019" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2.7"
        android:orientation="vertical"
        android:weightSum="2">

        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:paddingLeft="15dp"
            android:text="Akai Shuichi"
            android:textSize="16dp"
            android:textColor="#000"
            android:gravity="center_vertical"
            />

        <TextView
            android:id="@+id/tvNumber"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:paddingLeft="15dp"
            android:text="0982xxxxxx"
            android:textSize="16dp"
            android:textColor="#000"
            android:gravity="center_vertical"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1.3"
        android:weightSum="2"
        android:orientation="vertical">

        <Button
            android:id="@+id/btnEdit"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:backgroundTint="#3FE0FF"
            android:onClick="myClickHandler"
            android:text="Edit"
            android:textColor="#fff"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btnDelete"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:backgroundTint="#F73131"
            android:onClick="myClickHandler"
            android:text="Delete"
            android:textColor="#fff"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>

这是我的MainActivity.java:

package com.huy9515gmail.mycontact;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.edt_inputName) EditText edtName;
    @BindView(R.id.btnAdd) Button btnAdd;
    @BindView(R.id.btnEdit) Button btnEdit;
    @BindView(R.id.btnDelete) Button btnDelete;
    @BindView(R.id.edt_inputNumber) EditText edtNumber;
    @BindView(R.id.rdbtn_male) RadioButton rdbtn_male;
    @BindView(R.id.rdbtn_female) RadioButton rdbtn_female;
    @BindView(R.id.rdbtn_others) RadioButton rdbtn_others;
    @BindView(R.id.gender) RadioGroup genderSelection;
    private ListView lvContact;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    lvContact = (ListView) findViewById(R.id.lv_contact);
    final ArrayList<Contact> arrContact = new ArrayList<>();

    btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //validating contact info
            if (((edtName.getText().toString().trim()) == "") || (edtNumber.getText().toString().trim() == "") || ((rdbtn_male.isChecked()==false) && (rdbtn_female.isChecked()==false) &&(rdbtn_others.isChecked()==false))) {
                Toast.makeText(MainActivity.this, "Invalid contact info! Please try again!", Toast.LENGTH_SHORT).show();
            }
            //adding contact info
            else {
                Contact contact = new Contact(Gender.male, "", "");

                //adding info
                contact.setName(edtName.getText().toString());
                contact.setNumber(edtNumber.getText().toString());

                arrContact.add(contact);
            }

            CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, R.layout.row_listview, arrContact);
            lvContact.setAdapter(customAdapter);
        }
    });
}

public void myClickHandler(View v) {
    LinearLayout vwParentRow = (LinearLayout) v.getParent();
    Button btnEdit = (Button) vwParentRow.getChildAt(0);
    Button btnDelete = (Button) vwParentRow.getChildAt(1);

    btnEdit.setText("Clicked");
    btnDelete.setText("Clicked");
}
}

这是row_listview.xml布局:

row_listview.xml layout

2 个答案:

答案 0 :(得分:0)

确保您的XML文件中有一个元素,其ID如下:

android:id="@+id/btnAdd"

答案 1 :(得分:0)

而不是在XML中设置android:onClick,而不是像btnAdd那样设置。

按ID查找视图或使用butterknife,然后将以下内容放入onCreate()

btnEdit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Your code here
        }
    });
btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Your code here
        }
    });