我有一个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>
答案 0 :(得分:2)
完成修改
第二个获取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)
View.findViewById
返回this
,否则返回false。 ViewGroup.findViewById
在其子项上循环,在其中找到与您提供的ID匹配的匹配项。因此,如果您在按钮上设置onClickListener
,例如在onClick
内设置EditText
(或其他不是您点击的组件),您将会始终null