2016-06-08 118 views
1

我試圖創建一個簡單的listview。我做了很多次&這是我第一次面對這樣的錯誤。在Eclipse Luna &靛藍試用過這個。兩者都有相同的錯誤。無法啓動Activity Componentinfo(適配器構造函數)

這裏是我創建適配器的瞬間:

import java.util.ArrayList; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ListView; 


public class ActivityMain extends Activity { 
public ArrayList<StructRemedy> remedies = new ArrayList<StructRemedy>(); 
private ListView    lstContent; 
public AdapterRemedy   adapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    lstContent = (ListView) findViewById(R.id.lstContent); 
    adapter = new AdapterRemedy(remedies); 
    randomPopulation(); 
    lstContent.setAdapter(adapter); 
} 


private void randomPopulation() { 
    for (int i = 0; i < 30; i++) { 
     StructRemedy remedy = new StructRemedy(); 
     remedy.title = "Remedy" + i; 
     remedy.description = "Desc" + i; 
     remedy.rateValue = (float) (Math.random() * 5); 
     remedy.type = "tisane"; 
     remedy.use = "Headaches"; 
     remedies.add(remedy); 
    } 

    adapter.notifyDataSetChanged(); 
} 

} 

現在的錯誤日誌(錯誤referes到我創建的構造線,你知道的「超」線):

06-08 10:03:27.875: E/AndroidRuntime(2715): FATAL EXCEPTION: main 
06-08 10:03:27.875: E/AndroidRuntime(2715): java.lang.RuntimeException: Unable to start activity ComponentInfo{ahmad.azimi.app.herbal_remedies/test.test1.app.herbal_remedies.ActivityMain}: java.lang.NullPointerException 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.os.Looper.loop(Looper.java:137) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at dalvik.system.NativeStart.main(Native Method) 
06-08 10:03:27.875: E/AndroidRuntime(2715): Caused by: java.lang.NullPointerException 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at test.test1.app.herbal_remedies.AdapterRemedy.<init>(AdapterRemedy.java:22) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at test.test1.app.herbal_remedies.ActivityMain.onCreate(ActivityMain.java:22) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.Activity.performCreate(Activity.java:5104) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
06-08 10:03:27.875: E/AndroidRuntime(2715):  at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 

這是適配器:

import java.util.ArrayList; 
import android.content.Intent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.RatingBar; 
import android.widget.TextView; 


public class AdapterRemedy extends ArrayAdapter<StructRemedy> { 

    public AdapterRemedy(ArrayList<StructRemedy> remedies) { 
     super(G.context, R.layout.adapter_notes, remedies); 
    } 


    private static class ViewHolder { 

     public TextView txtTitle; 
     public TextView txtType; 
     public TextView txtFor; 
     public RatingBar rating; 
     public ViewGroup layoutRoot; 
     public ImageView imgLogo; 


     public ViewHolder(View view) { 
      layoutRoot = (ViewGroup) view.findViewById(R.id.layoutRoot); 
      txtTitle = (TextView) view.findViewById(R.id.txtTitle); 
      txtType = (TextView) view.findViewById(R.id.txtType); 
      txtFor = (TextView) view.findViewById(R.id.txtFor); 
      rating = (RatingBar) view.findViewById(R.id.rate); 
      imgLogo = (ImageView) view.findViewById(R.id.imgLogo); 

     } 


     public void fill(final ArrayAdapter<StructRemedy> adapter, final StructRemedy item, final int position) { 
      txtTitle.setText(item.title); 
      txtType.setText(item.type); 
      txtFor.setText(item.use); 
      rating.setRating(item.rateValue); 
      //imgLogo.setImageBitmap(bm); 

      layoutRoot.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(G.currentActivity, ActivitySelect.class); 
        intent.putExtra("POSITION", position); 
        G.currentActivity.startActivity(intent); 
       } 
      }); 

     } 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     StructRemedy item = getItem(position); 
     if (convertView == null) { 
      convertView = G.inflater.inflate(R.layout.adapter_notes, parent, false); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.fill(this, item, position); 
     return convertView; 
    } 
} 
+0

顯示'AdapterRemedy'類代碼也 –

+0

東西顯示代碼錯誤。 –

+0

適配器類添加。 – ARAZ

回答

1

試試這個:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    lstContent = (ListView) findViewById(R.id.lstContent); 

    randomPopulation(); 
} 

adapter = new AdapterRemedy (remedies) ; randomPopulation後。或者在randomPopulation方法中設置適配器。 並從randomPopulation中刪除adapter.notifyDataSetchanged()

做一些改變你的適配器代碼:

public AdapterRemedy(ArrayList<StructRemedy> remedies) { 
     super(G.context, R.layout.adapter_notes, remedies); 
    } 

更改它以這樣的:

public AdapterRemedy(context,ArrayList<StructRemedy> remedies) { 
     super(context, R.layout.adapter_notes, remedies); 
    } 

而且在randomPopulation:

adapter = new AdapterRemedy(this,remedies); 
    lstContent.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
+0

這將拋出'NullPointerException'作爲randomPopulation()具有'adapter.notifyDatasetChanged()'。他還需要將其刪除。 –

+0

@DaveRanjan是的。將添加這個答案。 –

+0

@ARAZ在onCreate()之外設置適配器。創建一個不同的函數,並隨機調用它並將數據傳遞給適配器。 –

0

更改您的onCreate()一樣,

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

lstContent = (ListView) findViewById(R.id.lstContent); 
randomPopulation();  
adapter = new AdapterRemedy(remedies); 

lstContent.setAdapter(adapter); 
} 

在adater初始化之前調用randomPopulation()。除去

adapter.notifyDataSetChanged(); 
+0

完成它。不起作用。現在同樣的錯誤引用了notifyDataSetChanged()行。 – ARAZ

相關問題