2013-11-14 98 views
2

我試圖用一個定義適配器擴展陣列適配器,但我得到一個空指針異常 我在這裏發佈我的代碼請到通過問題與自定義適配器

注:我不應該使用XML

我mainActivity是

package com.example.newslist; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.app.Activity; 
import android.util.DisplayMetrics; 
import android.view.Menu; 
import android.widget.LinearLayout; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.ListView; 

public class MainActivity extends Activity { 
DisplayMetrics dm = new DisplayMetrics(); 
public static int width,height; 
public String text="1"; 
int image = R.drawable.ic_launcher; 
public static ArrayList<ItemClass> listWithImage ; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     width=dm.widthPixels; 
     height = dm.widthPixels; 
     listWithImage=new ArrayList<ItemClass>(); 


     LinearLayout mainLayout = new LinearLayout(this); 
     mainLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     mainLayout.setOrientation(LinearLayout.VERTICAL); 
     setContentView(mainLayout); 

     ListView list1 = new ListView(this); 


     ItemClass item = new ItemClass(text, image); 
     listWithImage.add(item); 
     list1.setAdapter(new CustomAdapter(MainActivity.this,listWithImage)); 
     list1.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, (int) (height*0.4))); 
     mainLayout.addView(list1); 
     } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

,我的定義適配器是

package com.example.newslist; 

import java.util.List; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.TextView; 

public class CustomAdapter extends ArrayAdapter<ItemClass>{ 
    Context ctx; 
    static LinearLayout CustomLayout; 
    static TextView Name;  
    ImageView Image; 
    public CustomAdapter(Context context, List<ItemClass> objects) { 
     super(context, CustomLayout.getId(),Name.getId(), objects); 
     // TODO Auto-generated constructor stub 
    } 

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

     final ItemClass list = this.getItem(position); 

    CustomLayout = new LinearLayout(ctx); 
    CustomLayout.setId(2); 
    CustomLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); 
    CustomLayout.setOrientation(LinearLayout.VERTICAL); 

    Image = new ImageView(ctx); 
    Image.setLayoutParams(new LayoutParams((int) (MainActivity.width*0.006),(int)(MainActivity.height*0.006))); 
    Image.setImageResource(R.drawable.ic_launcher); 
    CustomLayout.addView(Image); 

    Name = new TextView(ctx); 
    Name.setId(1); 
    Name.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    Name.setPadding((int) (MainActivity.width*0.0005),(int)(MainActivity.height*0.0005),(int) (MainActivity.width*0.0005),(int)(MainActivity.height*0.0005)); 
    CustomLayout.addView(Name); 

    Image.setImageResource(list.getImage()); 
    Name.setText(""+list.getName()); 

    return CustomLayout; 




    } 


} 

和我的項目類是

package com.example.newslist; 

public class ItemClass { 
    public int imageId; 
    private String name; 
    public ItemClass(String text, int image) 
    { 
     this.name = text; 
     this.imageId = image; 
    } 
    public String getName() 
    { 
     return name; 
    } 
    public int getImage() 
    { 
     return imageId; 
    } 

} 
+0

代碼在這行你得到的異常? – 2Dee

+0

super(context,CustomLayout.getId(),Name.getId(),objects); 在自定義適配器 – Hummer

+0

甚至 list1.setAdapter(new CustomAdapter(MainActivity.this,listWithImage)); 主要活動 – Hummer

回答

0

TextView的名稱 assiging一個值,它之前accesed。這是導致空指針Name.getId(的exception.Instead)指定您的自定義佈局的資源ID喜歡R.layout.CUSTOM_LAYOUT
上下文CTX沒有得到分配任何值,就會造成空指針異常。嘗試下面

public class CustomAdapter extends ArrayAdapter<ItemClass>{ 
Context ctx; 
static LinearLayout CustomLayout; 
static TextView Name;  
ImageView Image; 
public CustomAdapter(Context context, List<ItemClass> objects) { 
    super(context, CustomLayout.getId(),R.layout.custom_adapter_view, objects); 
    ctx = context; 
} 

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

    final ItemClass list = objects.getItem(position); 

CustomLayout = new LinearLayout(ctx); 
CustomLayout.setId(2); 
CustomLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); 
CustomLayout.setOrientation(LinearLayout.VERTICAL); 

Image = new ImageView(ctx); 
Image.setLayoutParams(new LayoutParams((int) (MainActivity.width*0.006),(int)(MainActivity.height*0.006))); 
Image.setImageResource(R.drawable.ic_launcher); 
CustomLayout.addView(Image); 

Name = new TextView(ctx); 
Name.setId(1); 
Name.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
Name.setPadding((int) (MainActivity.width*0.0005),(int)(MainActivity.height*0.0005),(int) (MainActivity.width*0.0005),(int)(MainActivity.height*0.0005)); 
CustomLayout.addView(Name); 

Image.setImageResource(list.getImage()); 
Name.setText(""+list.getName()); 

return CustomLayout; 




} 

}

+1

我甚至沒有使用一個佈局 – Hummer

+0

然後指定textview的ID – SathMK

0

你沒有初始化的變量CustomLayout和名稱,所以當你打電話CustomLayout.getId()Name.getId(),則返回null,不會被父類的構造函數被接受,因此拋出一個空指針。

編輯:嘗試使用此構造:

public CustomAdapter(Context context, List<ItemClass> objects) { 
    super(context, android.R.layout.simple_list_item_1, android.R.id.text1, objects); 
    ctx = context; 
} 
+0

你能告訴我,我應該做 – Hummer

+0

你可以使用android.R.layout.simple_list_item_1和android.R.id.text1,而不是從視圖中獲取ID被創建。 – 2Dee

+0

沒有朋友給我一個更復雜的錯誤 – Hummer