2013-11-14 64 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