2

大家好

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

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

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

Post1 - 堆栈溢出

Post2 - 堆栈溢出

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

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

4

2 回答 2

1

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);
于 2012-09-26T15:22:57.753 回答
0

尝试在没有父级的情况下膨胀布局

用这个:

convertView = inflater.inflate(layoutResourceId, null);

取而代之的是:

convertView = inflater.inflate(layoutResourceId, parent, false);

编辑 1

如果这没有帮助,请尝试在 getView() 中按 id 膨胀布局

convertView = inflater.inflate(R.layout.listitem_row, null);
于 2012-09-26T14:51:52.037 回答