簡體   English   中英

設置自定義列表視圖適配器時出現NullPointer異常

[英]NullPointer Exception while setting custom listview adapter

我已經搜索了幾個小時以解決此問題,但是我什么也找不到。 我在listView.setAdapter(adapter);行中得到了NullPointerException listView.setAdapter(adapter);

XML:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical">

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" /> 

 </LinearLayout>

OfflineActivity:

  public class OfflineActivity extends Activity implements OnItemClickListener
  {
  String[] fileName;
  String[] name;
List<RowItem> rowItems;
String[] dis;
ListView listView;
BufferedReader br;
InputStream in;
String line;
File file;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    File f = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.example.test/database/");
    f.mkdirs();
    fileName = f.list();
    String[] nameTemp = new String[fileName.length + 1];
    String[] disTemp = new String[fileName.length + 1];
    if(fileName[0] == null){
        setContentView(R.layout.empty);
    }
    else{
        setContentView(R.layout.offline);
        try{
            for(int i=0; i<fileName.length; i++){
                file = new File(Environment.getExternalStorageDirectory().toString()+"/Android/data/com.example.test/database/"+fileName[i]);
                in = new FileInputStream(file);
                br = new BufferedReader(new InputStreamReader(in));
                nameTemp[i] = br.readLine();
                line = br.readLine();
                disTemp[i] = br.readLine();
            }
     }catch(FileNotFoundException e){} catch(IOException e){}
        name = nameTemp;
        dis = disTemp;
        setContentView(R.layout.empty);
        rowItems = new ArrayList<RowItem>();
        for (int i = 0; i < name.length; i++) {
            if(name[i]==null) break;
            RowItem item = new RowItem(name[i], dis[i]);
            rowItems.add(item);
        }
        listView = (ListView) findViewById(R.id.list);
        CustomListViewAdapter adapter = new CustomListViewAdapter(this, R.layout.list_item, rowItems);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(this);
    }
}   
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(this, "Loading Lyrics for "+name[position]+"...", Toast.LENGTH_SHORT).show();
    Intent i = new Intent(this, ShowDataActivity.class);
    i.putExtra("name", name[position]);
    i.putExtra("fileName", fileName[position]);
    startActivity(i); 
}

 }

這是CustomListViewAdapter類的代碼:

 public class CustomListViewAdapter extends ArrayAdapter<RowItem> {
Context context;
public CustomListViewAdapter(Context context, int resourceId, List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
}
/*private view holder class*/
private class ViewHolder {
    TextView txtTitle;
    TextView txtDesc;
}
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);
    LayoutInflater mInflater = (LayoutInflater) context
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();
    holder.txtDesc.setText(rowItem.getDesc());
    holder.txtTitle.setText(rowItem.getTitle());
    return convertView;
}
  }

這是RowItem類的代碼:

 public class RowItem {
private String title;
private String desc;
public RowItem( String title, String desc) {
    this.title = title;
    this.desc = desc;
}
public String getDesc() {
    return desc;
}
public void setDesc(String desc) {
    this.desc = desc;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
@Override
public String toString() {
    return title + "\n" + desc;
}
 }

這是我的日志:

  E/AndroidRuntime(20534): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.OfflineActivity}: java.lang.NullPointerException
  E/AndroidRuntime(20534):  at com.example.test.OfflineActivity.onCreate(OfflineActivity.java:59)
  W/ActivityManager(22626):   Force finishing activity com.example.test/.OfflineActivity

我的第59行是: listView.setAdapter(adapter);

任何解決此問題的幫助將不勝感激

如果我錯了請指正我,但看來你在打電話

setContentView(R.layout.empty);

再次嘗試初始化listView 假設R.layout.empty不包含idlistListView ,則在您嘗試初始化listView時將返回null

由於這樣的原因,在同一Activity多次調用setContentView()並不是一個好主意。 恕我直言,幾乎總是有更好的方法。

就像codeMagic所說,您的布局“空”或“離線”都不包含listView

為什么不只使用一種布局,如果您不想只顯示一個布局,它將包含列表視圖

listView.setVisibility(View.GONE);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM