2014-03-30 60 views
0

我一直試圖讓我的列表視圖工作相當長一段時間了,我只是改變了我的監聽器從onClick到onItemClick來更好地處理listview項目,但應用程序再次崩潰,我的代碼如下,任何幫助將不勝感激。ListView項目OnItemClick在ListView適配器中崩潰類

類:

public class ListViewAdapterProduct extends BaseAdapter { 

Context mContext; 
ListView listView = (ListView) findViewById(R.id.listview1); 

listView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 

     Resources res = mContext.getResources(); 
     productTitleArray = res.getStringArray(R.array.titles_product); 

     for (String productTitle : productTitleArray) 
     { 
      if(productTitle.equals("productOne")) 
      { 
      Log.d("Msg", "Found"); 
      }    
     else 
      { 
       Log.d("Msg", "Not Found"); 
      } 
     } 
    } 
}); 

我以前的帖子:

Compare XML String From Java Class When Item In ListView Is Clicked

logcat的

03-30 16:40:39.027: E/AndroidRuntime(811): FATAL EXCEPTION: main 
03-30 16:40:39.027: E/AndroidRuntime(811): java.lang.NullPointerException 
03-30 16:40:39.027: E/AndroidRuntime(811): at com.twostarii.test.ListViewAdapterproduct.getView(ListViewAdapterproduct.java:91) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.AbsListView.obtainView(AbsListView.java:2159) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.ListView.makeAndAddView(ListView.java:1831) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.ListView.fillDown(ListView.java:674) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.ListView.fillFromTop(ListView.java:735) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.ListView.layoutChildren(ListView.java:1652) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.AbsListView.onLayout(AbsListView.java:1994) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.View.layout(View.java:14008) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewGroup.layout(ViewGroup.java:4373) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.View.layout(View.java:14008) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewGroup.layout(ViewGroup.java:4373) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.View.layout(View.java:14008) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewGroup.layout(ViewGroup.java:4373) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.View.layout(View.java:14008) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewGroup.layout(ViewGroup.java:4373) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.View.layout(View.java:14008) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewGroup.layout(ViewGroup.java:4373) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.Choreographer.doFrame(Choreographer.java:532) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.os.Handler.handleCallback(Handler.java:725) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.os.Looper.loop(Looper.java:137) 
03-30 16:40:39.027: E/AndroidRuntime(811): at android.app.ActivityThread.main(ActivityThread.java:5041) 
03-30 16:40:39.027: E/AndroidRuntime(811): at java.lang.reflect.Method.invokeNative(Native Method) 
03-30 16:40:39.027: E/AndroidRuntime(811): at java.lang.reflect.Method.invoke(Method.java:511) 
03-30 16:40:39.027: E/AndroidRuntime(811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-30 16:40:39.027: E/AndroidRuntime(811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-30 16:40:39.027: E/AndroidRuntime(811): at dalvik.system.NativeStart.main(Native Method) 

活動:

public class MainActivityproduct extends MainActivity { 


ListView list; 
ListViewAdapterproduct adapter; 
EditText editsearch; 
String[] position; 
String[] productTitles; 
String[] productDescriptions; 
int[] images={ 
     R.drawable.list_product_one, 
     R.drawable.list_product_two, 
     R.drawable.list_product_three, 
    }; 


ArrayList<ClassproductList> arraylist = new ArrayList<ClassproductList>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    position = new String[] { "1", "2", "3"}; 

    Resources res = getResources(); 
    productTitles = res.getStringArray(R.array.titles_product); 
    productDescriptions = res.getStringArray(R.array.descriptions_product); 

    list = (ListView) findViewById(R.id.listview1); 

    list.setAdapter(adapter); 

    for (int i = 0; i < position.length; i++) 
    { 
     ClassproductList wp = new ClassproductList(productTitles[i], productDescriptions[i],images[i]); 
     arraylist.add(wp); 
    } 

    adapter = new ListViewAdapterproduct(this, arraylist); 

    list.setAdapter(adapter); 

    editsearch = (EditText) findViewById(R.id.search); 

    editsearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      String text = editsearch.getText().toString().toLowerCase(Locale.getDefault()); 
      adapter.filter(text); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, 
       int arg2, int arg3) { 
     } 

     public void onTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

}

+1

崩潰怎麼辦?有沒有可以提供的堆棧跟蹤? –

+0

我發佈了logcat,它沒有告訴我任何東西,因此我沒有發佈它,謝謝回覆 – TwoStarII

+0

'mContext'爲null定義它 – Jack

回答

0

你有Context mContext;一個問題是空

您的活動

設置mContext = this;所以mContext將是活動context,你將能夠使用的資源

這是正確的代碼:

因爲您已經發送了this在您的適配器中,您需要在那裏找到它

public class ListViewAdapterProduct extends BaseAdapter { 

Context mContext; 
ArrayList<ClassproductList> arraylist; 

ListView listView = (ListView) findViewById(R.id.listview1); 

//add this 
public ListViewAdapterProduct (Context mContext,ArrayList<ClassproductList> arraylist) 
{ 
this.mContext = mContext; 

this.arraylist = arraylist; 
} 
+0

無法正常工作,您應該在哪裏定義 – TwoStarII

+0

?我只是用例子編輯我的答案你試過了嗎? – Jack

+0

我看到,你正在一個活動中工作,但是我在一個列表適配器類中工作:public class ListViewAdapterProduct extends BaseAdapter { – TwoStarII

0

你已經聲明瞭mContext,但是你還沒有初始化它。

您可以在適配器的構造做到這一點:

public class ListViewAdapterProduct extends BaseAdapter { 

    Context mContext; 

    // the construcor that initializes the context 
    public ListViewAdapterProduct(Context c){ 
     mContext = c; 
    } 
    ... 

但是,你已經張貼的痕跡,認爲問題出在你的適配器的getView()方法,對線91您應該檢查也。

ListViewAdapterproduct.getView(ListViewAdapterproduct.java:91) 

編輯:

list.setAdapter(adapter); 

在該行的適配器爲空,你沒有初始化...(你設置你的適配器兩次,第一次與空)。 在本地定義變量並僅在實際需要時才使它們成爲類變量是一種很好的做法。這種方式更難忘記初始化。

+0

這是公共查看getView(最終詮釋位置,視圖視圖,ViewGroup父母){ 沒有錯誤在這裏,問題出現時,我改變我的onClick到onItemClick – TwoStarII

+0

看看你的logcat異常跟蹤。第一行說NullPointerException在getView()方法的第91行:) – kupsef

+0

我上面發佈我的代碼的原因是爲了得到詳細的幫助,你如何設想我去這 – TwoStarII

0

已解決!!!

我從onItemClick改回(併發定製適配器使用)來的onClick(簡單的自定義適配器使用)和應用:

view.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View arg0) { 

    String mytitle=holder.title.getText().toString(); 

    if(mytitle.equals("ProductOne")){ 
     Intent intent1 = new Intent(mContext, ProductClass.ProductOne); 
     mContext.startActivity(intent1); 

     ...   

    } 
}  

不得不補充:

String mytitle=holder.title.getText().toString();