gpt4 book ai didi

android - Android 中 FindViewById 的空指针异常

转载 作者:行者123 更新时间:2023-11-29 02:01:12 27 4
gpt4 key购买 nike

大家好

今天我开始开发自己的小闹钟应用程序。但是现在遇到一个问题,找了三个小时也没有解决。

当我尝试为每一行实现一个带有自定义设计的 ListView 时,当我尝试从布局中的 TextView 设置文本时,我得到一个 NullPointerException。此异常的原因是,findViewById-Call 返回 null 而不是我想要的 TextView。

在我的搜索中我找到了这两篇文章,但不幸的是它们并没有很好的帮助......

Post1 - Stackoverflow

Post2 - Stackoverflow

我使用的基本结构与上面两篇文章中的基本结构相同,但我找不到错误...这是我的应用程序中的一些代码:

listitem_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="vertical"
android:padding="6dip" >

<TextView
android:name="@+id/toptext"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:layout_gravity="center_vertical"/>

<TextView
android:name="@+id/bottomtext"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:layout_gravity="center_vertical"/>

</LinearLayout>

我的适配器:

public class AlarmClockArrayAdapter extends ArrayAdapter<RowItem> {    
private class ViewHolder {
TextView headText;
TextView subText;
}


public AlarmClockArrayAdapter(Context context, int layoutId, List<RowItem> objects) {
super(context, layoutId, objects);
this.mContext = context;
this.layoutResourceId = layoutId;
this.mListItems = objects;
}


/** getView()
*
* ListView asks the Adapter for a view for each list item element
* Override the getView()-Method to customize the ListView
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if(convertView == null) {
convertView = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
// findViewById(...) returns Null
holder.headText = (TextView) convertView.findViewById(R.id.toptext);
holder.subText = (TextView) convertView.findViewById(R.id.bottomtext);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}

RowItem rowItem = (RowItem) getItem(position);

// HERES THE NULLPOINTEREXCEPTION
holder.headText.setText(rowItem.getHeadText());
holder.subText.setText(rowItem.getSubText());

return convertView;
}

至少是 MainActivity,我从那里实例化适配器

public class MainActivity extends Activity {
public void initList() {

//Adapter for the listview
AlarmClockArrayAdapter mAdapter = new AlarmClockArrayAdapter(this, R.layout.listitem_row, this.mListItems);

final ListView mListView = (ListView) findViewById(R.id.listView1);
mListView.setAdapter(mAdapter);
}

任何帮助都会很棒...谢谢! :D

最佳答案

1)签到

holder.headText.setText(rowItem.getHeadText());

正好holder.headText返回null

2)签到

if(convertView == null) {}
else {
holder = (ViewHolder) convertView.getTag();
}

执行第一个分支

3) 通常我是这样做的:

// in constructor
inflater = LayoutInflater.from(context); // context from Activity

public View getView(int position, @Nullable View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.listitem_row, null);
}

headText = (TextView) convertView.findViewById(R.id.toptext);
subText = (TextView) convertView.findViewById(R.id.bottomtext);

关于android - Android 中 FindViewById 的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12590342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com