2017-01-19 37 views
1

我使用自定義適配器創建ListView。
在客戶適配器類中,我將一個Context對象傳遞給它的超類,並在爲Adapter類創建對象時將一個Context對象傳遞給MainActivity在自定義適配器類中顯示空指針的上下文異常?

它顯示了以下錯誤

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mylistpractice/com.mylistpractice.MainActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 

現在我通過getApplicationContext()而非Context對象,同時從MainActivity傳遞參數,並沒有顯示出任何錯誤。

我對傳遞一個Context對象和傳遞getApplicationContext()之間的區別感到困惑。

但它沒有在ListView中顯示任何數據。

這是適配器類

public class Myadapter extends ArrayAdapter<Data> { 
ArrayList<Data> arraydata; 
Context context; 

public Myadapter(ArrayList<Data> arraydata,Context context) { 
    super(context,R.layout.content,arraydata); 
    this.arraydata=arraydata; 
    this.context=context; 
} 

@Override 
public int getCount() { 
    return 0; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Data data=getItem(position); 
    Viewholder viewholder; 
    View vi=convertView; 

    if(vi==null) { 
     viewholder=new Viewholder(); 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     vi = inflater.inflate(R.layout.content, parent, false); 
     viewholder.name=(TextView)vi.findViewById(R.id.name); 
     viewholder.id=(TextView)vi.findViewById(R.id.id); 
     vi.setTag(viewholder); 
    } else { 
     viewholder=(Viewholder)vi.getTag(); 
    } 
    viewholder.name.setText(data.getName()); 
    viewholder.id.setText(data.getId()); 
    return vi; 
} 

public class Viewholder { 
    TextView id; 
    TextView name; 
} 
} 

這是我的MainActivity

public class MainActivity extends AppCompatActivity { 
    ListView list; 
    ArrayList<Data> arraydata=new ArrayList<>(); 
    Myadapter myadapter; 
    Context context; 
    Data data; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list=(ListView)findViewById(R.id.list); 
     setList(); 
     myadapter = new Myadapter(arraydata,MainActivity.this); 
     list.setAdapter(myadapter); 
    } 

    public void setList() { 

     for(int i=0;i<15;i++) { 
      String s,id; 
      data = new Data(); 
      data.setName("Farhana:::"+i); 
      s = data.getName(); 
      data.setId("Id:::"+i); 
      id = data.getId(); 
      arraydata.add(data); 
      Log.e("DAtA:--",s); 
      Log.e("ID:--",id); 
     } 
    } 
} 
+1

在getCount方法中返回arraydata大小 –

回答

3

,但沒有表現出ANYDATA在列表視圖

因爲你告訴它不產生任何的意見。

@Override 
public int getCount() { 
    return 0; 
} 

您正在使用ArrayAdapter。你並不需要實現getCount,但如果這樣做,返回大小列表

@Override 
public int getCount() { 
    return arraydata == null ? 0 : arraydata.size(); 
} 

不管怎麼說,對於你的問題,傾向於使用MainActivity.this喜歡你做的上下文(活動上下文)。

如果你的錯誤是在這裏

LayoutInflater inflater = LayoutInflater.from(getContext()); 

然後,可以替換爲

LayoutInflater inflater = LayoutInflater.from(this.context); 

您得到了來自構造

+0

getCount()已被覆蓋 – farhana

+1

您誤解了我的觀點。它返回零。因此沒有顯示 –

1

要覆蓋方法getCount將()範圍內;並返回零,你必須返回數組列表的大小。