2013-09-04 3 views
0

Я искал в течение нескольких часов, чтобы решить эту проблему, но я ничего не могу найти. Я получаю NullPointerException в строке listView.setAdapter(adapter);Исключение NullPointer при настройке настраиваемого адаптера listview

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; 
} 
} 

Это мой LogCat:

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 

Мой пятьдесят девятой линия: listView.setAdapter(adapter);

Любая помощь для решения этой проблемы будут оценены

+0

'findViewById (R.id.list)' 'возвратит null' если не найден. У вас есть этот ресурс? –

+0

Что на линии 59? – Ahmad

+0

отправить xml, где вы ahve listview – Raghunandan

ответ

3

Поправьте меня, если я неправильно, но похоже, что вы звоните

setContentView(R.layout.empty); 

снова перед попыткой инициализации listView. Предполагая, что R.layout.empty не содержит ListView с id из list, он будет возвращать null при попытке инициализации listView.

Для таких целей, как правило, не рекомендуется звонить setContentView() более одного раза в том же Activity. Почти всегда есть лучший способ, ИМХО.

+0

да, кажется, вы правы – Raghunandan

+0

Ничего не произошло даже после удаления, если else statement & setContentView (R.layout.empty). Все равно получается такое же исключение в одной строке. – ashu

+0

Итак, у вас теперь есть * только * ** один ** 'setContentView()' с параметром файла макета, который содержит 'ListView' с' id' списка? – codeMagic

1

как codeMagic говорят, либо макет «пустой» или «офлайн» это не распространяется содержать ListView

почему бы не использовать только один макет, который будет содержать ListView, если вы не хотите, чтобы показать просто установить

listView.setVisibility(View.GONE);

Смежные вопросы