findViewById从listview OnClickListener返回null

时间:2014-06-16 09:11:53

标签: android

我有一个activity_main.xml,里面有一个listview -

       <EditText
            android:id="@+id/phoneText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="phone">

        </EditText>
       <ListView
            android:id="@+id/contactList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="30dp">

        </ListView>

此列表视图有一个&#39;编辑&#39; imageview点击哪个应该填充activity_main.xml中声明的textview。 imageview的onclick事件代码显示在 -

下面
      View.OnClickListener editRecordHandler = new View.OnClickListener() {

       public void onClick(View v) {
        TextView phone = (TextView) v.findViewById(R.id.phoneText);
        phone.setText("ABC");
        }
    };

但findViewById返回null。请注意,填充listview和editRecordHandler的代码位于与MainActivity.java不同的类中。

P.S。显然这不是一个重复的帖子,因为我已经扫描了所有现有的帖子,只发现一个相关但不确定解决方案

https://groups.google.com/forum/#!topic/android-developers/dS1QVVD_3jI

DBAdapter的完整代码

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;



public class DBAdapter extends BaseAdapter {


private DBHelper dbHelper = null;

public DBAdapter(DBHelper dbHelper) {
    this.dbHelper = dbHelper;

}

@Override
public int getCount() {
    return 1;
}

@Override
public Object getItem(int index) {
    return null;
}

@Override
public long getItemId(int index) {
    return 1;
}

@Override
public View getView(int index, View view, ViewGroup parent) {
    if (view == null) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        view = inflater.inflate(R.layout.list_view_item , parent, false);
    }

    ImageView deleteView = (ImageView) view.findViewById(R.id.deleteButton);
    deleteView.setOnClickListener(deleteRecordHandler);
    deleteView.setTag(contact.id);

    ImageView editView = (ImageView) view.findViewById(R.id.editButton);
    editView.setOnClickListener(editRecordHandler);
    editView.setTag(contact.id);

    return view;
}



    View.OnClickListener editRecordHandler = new View.OnClickListener() {

    public void onClick(View v) {

        TextView phone = (TextView) v.findViewById(R.id.phoneText);
        phone.setText("ABC");

    }
};


}

List_view_Item.xml如下

<LinearLayout>

<ImageView
    android:id="@+id/deleteButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/delete_button"
    android:layout_marginLeft="10dp"
    android:paddingTop="15dp"
    android:src="@drawable/ic_del_unselected" />

<ImageView
    android:id="@+id/editButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/delete_button"
    android:layout_marginLeft="10dp"
    android:paddingTop="15dp"
    android:src="@drawable/ic_edit" />

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="35dp"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/nameDisplay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:textStyle="bold"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/modeDisplay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp" />

</LinearLayout>

</LinearLayout>

2 个答案:

答案 0 :(得分:2)

完成修改

  • 首先,你不是在改变TextView文本,而是在改变EditText文本,对吧?因为id phoneText适用于EditText。
  • 第二个获取listview行之外的视图,请执行以下操作:

    @Override    
    public View getView(int index, View view, ViewGroup parent) {    
        if (view == null) {      
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());  
            view = inflater.inflate(R.layout.list_view_item , parent, false);  
        }
    
        final OnClickListener editRecordHandler = new OnClickListener() {
    
            @override
            public void onClick(View v) {
                View v2 = parent.getRootView();
                TextView phone = (TextView) v2.findViewById(R.id.phoneText);
                phone.setText("ABC");
            }
        }
    
        ImageView deleteView = (ImageView) view.findViewById(R.id.deleteButton);
        deleteView.setOnClickListener(deleteRecordHandler);
        deleteView.setTag(contact.id);
    
        ImageView editView = (ImageView) view.findViewById(R.id.editButton);
        editView.setOnClickListener(editRecordHandler);
        editView.setTag(contact.id);
    
        return view;      
    }
    

答案 1 :(得分:0)

如果视图的ID匹配,则

View.findViewById返回this,否则返回false。 ViewGroup.findViewById在其子项上循环,在其中找到与您提供的ID匹配的匹配项。因此,如果您在按钮上设置onClickListener,例如在onClick内设置EditText(或其他不是您点击的组件),您将会始终null