返回空视图 ID 的自定义列表适配器 onClick 方法
Custom list adapter onClick method returning a null view id
在创建自定义列表适配器以便能够单击单个行条目中的不同元素并启动不同的活动时,我 运行 遇到了一个问题,我的 findViewById() 方法返回 null。此外,只有我的 ListView 中的第一项调用 onClick 方法;其他行不记录点击。
public class CustomListAdapter extends SimpleAdapter implements View.OnClickListener {
Context context;
TextView habitId;
Intent intent;
public CustomListAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.habit_entry, null);
}
TextView tv = (TextView) v.findViewById(R.id.habitTitle);
tv.setOnClickListener(this);
ImageView iv = (ImageView) v.findViewById(R.id.plus);
iv.setOnClickListener(this);
return super.getView(position, convertView, parent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.habitTitle:
Log.d("Test", "habitid = " + v.findViewById(R.id.habitId));
break;
case R.id.plus:
Log.d("Test", "plus clicked");
default:
break;
}
}
代码为运行时,onClick的habitTitle case打印
D/NULL: habitid = null
habit_entry
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:src="@drawable/ic_plus"
android:id="@+id/plus"
android:scaleType="centerCrop"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:background="#9bfcff" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/habitId"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="difficulty"
android:id="@+id/habitDifficulty"
android:gravity="right"
android:paddingLeft="15dp"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/habitTitle"
android:layout_alignEnd="@+id/habitTitle"
android:layout_marginRight="30dp"
android:layout_marginEnd="30dp" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/plus"
android:layout_above="@id/habitDifficulty"
android:layout_alignWithParentIfMissing="true"
android:text="Your new habits go here!"
android:id="@+id/habitTitle"
android:padding="5dp"
android:textColor="#444444"
android:textSize="20sp"
android:textStyle="bold"
android:layout_alignParentStart="false"
android:gravity="right"
android:allowUndo="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="frequency"
android:id="@+id/habitFrequency"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
在 MainActivity 中调用
if(habitList.size() != 0) {
ListView listView = (ListView) findViewById(android.R.id.list);
ListAdapter adapter = new CustomListAdapter(
this, habitList, R.layout.habit_entry, new String[]{"habitId", "title", "difficulty", "frequency"}, new int[]{
R.id.habitId, R.id.habitTitle, R.id.habitDifficulty, R.id.habitFrequency});
listView.setAdapter(adapter);
}
列表完美填充,所以我不确定为什么我的适配器有这么多问题。
我看到这里有几个问题。您自己给 View
充气,然后返回通过调用 super.getView(position, convertView, parent);
返回的 View
。您应该改为依靠 super.getView(position, convertView, parent);
为您创建 View
,因为您使用的是这样的默认实现:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
v.findViewById(R.id.habitTitle)
.setOnClickListener(this);
v.findViewById(R.id.plus)
.setOnClickListener(this);
return v;
}
另外 v.findViewById(R.id.habitId));
在 onClick()
中返回 null 因为变量 v
本身是 ID = R.id.habitId.
的 TextView
您将 habitId 文本视图的可见性设置为消失。
textview 不会膨胀并且为空。
您可以在 android documentation
中阅读有关可见性的更多信息
在创建自定义列表适配器以便能够单击单个行条目中的不同元素并启动不同的活动时,我 运行 遇到了一个问题,我的 findViewById() 方法返回 null。此外,只有我的 ListView 中的第一项调用 onClick 方法;其他行不记录点击。
public class CustomListAdapter extends SimpleAdapter implements View.OnClickListener {
Context context;
TextView habitId;
Intent intent;
public CustomListAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.habit_entry, null);
}
TextView tv = (TextView) v.findViewById(R.id.habitTitle);
tv.setOnClickListener(this);
ImageView iv = (ImageView) v.findViewById(R.id.plus);
iv.setOnClickListener(this);
return super.getView(position, convertView, parent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.habitTitle:
Log.d("Test", "habitid = " + v.findViewById(R.id.habitId));
break;
case R.id.plus:
Log.d("Test", "plus clicked");
default:
break;
}
}
代码为运行时,onClick的habitTitle case打印
D/NULL: habitid = null
habit_entry
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:src="@drawable/ic_plus"
android:id="@+id/plus"
android:scaleType="centerCrop"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:background="#9bfcff" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/habitId"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="difficulty"
android:id="@+id/habitDifficulty"
android:gravity="right"
android:paddingLeft="15dp"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/habitTitle"
android:layout_alignEnd="@+id/habitTitle"
android:layout_marginRight="30dp"
android:layout_marginEnd="30dp" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/plus"
android:layout_above="@id/habitDifficulty"
android:layout_alignWithParentIfMissing="true"
android:text="Your new habits go here!"
android:id="@+id/habitTitle"
android:padding="5dp"
android:textColor="#444444"
android:textSize="20sp"
android:textStyle="bold"
android:layout_alignParentStart="false"
android:gravity="right"
android:allowUndo="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="frequency"
android:id="@+id/habitFrequency"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
在 MainActivity 中调用
if(habitList.size() != 0) {
ListView listView = (ListView) findViewById(android.R.id.list);
ListAdapter adapter = new CustomListAdapter(
this, habitList, R.layout.habit_entry, new String[]{"habitId", "title", "difficulty", "frequency"}, new int[]{
R.id.habitId, R.id.habitTitle, R.id.habitDifficulty, R.id.habitFrequency});
listView.setAdapter(adapter);
}
列表完美填充,所以我不确定为什么我的适配器有这么多问题。
我看到这里有几个问题。您自己给 View
充气,然后返回通过调用 super.getView(position, convertView, parent);
返回的 View
。您应该改为依靠 super.getView(position, convertView, parent);
为您创建 View
,因为您使用的是这样的默认实现:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
v.findViewById(R.id.habitTitle)
.setOnClickListener(this);
v.findViewById(R.id.plus)
.setOnClickListener(this);
return v;
}
另外 v.findViewById(R.id.habitId));
在 onClick()
中返回 null 因为变量 v
本身是 ID = R.id.habitId.
TextView
您将 habitId 文本视图的可见性设置为消失。 textview 不会膨胀并且为空。 您可以在 android documentation
中阅读有关可见性的更多信息