2013-05-06 40 views
0

我試圖做類別listview。我想用我的代碼很容易理解和使用如何使BaseAdapter工作

我有一個MainActivity類別

public class MainActivity extends Activity{ 
private MyCustomAdapter mAdapter; 
ListView lst; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    lst = (ListView)findViewById(R.id.lstView); 
    mAdapter = new MyCustomAdapter(this); 
    for (int i = 1; i < 50; i++) { 
     mAdapter.addItem("Sameer Blog " + i); 
     if (i % 4 == 0) { 
      mAdapter.addSeparatorItem("Ahmad " + i); 
     } 
    } 
    lst.setAdapter(mAdapter); 
} 

}

和MyCustomAdapter類這樣

public class MyCustomAdapter extends BaseAdapter { 
private static final int TYPE_ITEM = 0; 
private static final int TYPE_SEPARATOR = 1; 
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1; 

private ArrayList<String> mData = new ArrayList<String>(); 
private LayoutInflater mInflater; 
private Context context; 
private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>(); 

public MyCustomAdapter(Context c) { 
    this.context = c; 
    mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
} 

public void addItem(final String item) { 
    mData.add(item); 
    notifyDataSetChanged(); 
} 

public void addSeparatorItem(final String item) { 
    mData.add(item); 
    // save separator position 
    mSeparatorsSet.add(mData.size() - 1); 
    notifyDataSetChanged(); 
} 

public int getItemViewType(int position) { 
    return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
} 


public int getViewTypeCount() { 
    return TYPE_MAX_COUNT; 
} 

public int getCount() { 
    return mData.size(); 
} 

public String getItem(int position) { 
    return mData.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    TextView txtView = null; 
    int type = getItemViewType(position); 
    if (convertView == null) { 
     switch (type) { 
      case TYPE_ITEM: 
       convertView = mInflater.inflate(R.layout.list_item, null); 
       txtView = (TextView)convertView.findViewById(R.id.txtItem); 
       break; 
      case TYPE_SEPARATOR: 
       convertView = mInflater.inflate(R.layout.list_header, null); 
       txtView = (TextView)convertView.findViewById(R.id.txtHeader); 
       break; 
     } 

    } 
    txtView.setText(mData.get(position)); 
    return convertView; 
} 

}

但我總是在logcat中得到NullPointerException。有人可以幫我嗎?

+1

安置自己的logcat並標記發生錯誤 – ianhanniballake 2013-05-06 04:45:33

+0

你得到了什麼行空指針行? – 2013-05-06 04:49:42

+0

覆蓋MyCustomAdapter類中的notifyDataSetChanged()...並調用adapter.notifyDataSetChanged();當你添加數據到listitem。 – AndiM 2013-05-06 05:15:20

回答

2

可能是由於

notifyDataSetChanged(); 

addItemaddSeparatorItem調用而不列表視圖設置適配器。

試着改變你的:

public MyCustomAdapter(Context c) { 
    this.context = c; 
    mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
} 

到:

public MyCustomAdapter(Context c) { 
    this.context = c; 
    mInflater =LayoutInflater.from(getContext()); 
} 
+0

不,我不這麼認爲。我使用ListActivity,它工作正常。但是,當我更改爲活動。它使錯誤 – 2013-05-06 05:41:53

+0

@NamNguyen請檢查編輯的答案 – 2013-05-06 06:09:07

+0

你的代碼沒有運行:( – 2013-05-06 08:42:37

相關問題