我是一名iOS開發人員,跳轉到Android來移植我正在開發的項目,而且我似乎無法掌握Android自定義BaseAdapter的一些概念。我正在開發一個應用程序,用於解析站點中的XML,並將XML元素中的文本填充到ListView中。我有XML解析部分沒有問題。我碰到的問題是在列表視圖中的每一行添加一個按鈕。我理解設置OnClick Listener的概念,並且需要實現BaseAdapter,但似乎無法將我的數據從我的主要活動獲取到包含BaseAdapter的類中。目前,數據不會在應用程序啓動時顯示。我已經執行了一些調試,並驗證了來自menuItems ArrayList的數據正確地發送到BaseAdapter類,我只是沒有得到如何讓它顯示在ListView中。這可能是一個非常小的事情,我認爲我只是看了太久而沒有看到它。任何幫助將不勝感激。下面列出了代碼和佈局XML。Android - BaseAdapter - XML,ListView,按鈕
public class Podcasts extends ListActivity{
private static final String HASHMAP_ID = "_id";
private CustomAdapter adap;
static final String URL = "http://www.undignified.podbean.com/feed";
//XML Node Keys
static final String KEY_ITEM = "item";
static final String KEY_TITLE = "title";
static final String KEY_DESCRIPTION = "itunes:subtitle";
static final String KEY_PODCASTURL = "enclosure";
public static final ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.podcasts);
//Instance of XML parser
UndigParser uparser = new UndigParser();
String xml = uparser.getXmlFromURL(URL);
Document doc = uparser.getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
for(int i = 0; i < nl.getLength(); i++){
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
map.put(KEY_TITLE, uparser.getValue(e, KEY_TITLE));
map.put(KEY_DESCRIPTION, uparser.getValue(e, KEY_DESCRIPTION));
map.put(KEY_PODCASTURL, uparser.getValue(e, KEY_PODCASTURL));
menuItems.add(map);
}
adap = new CustomAdapter(this, menuItems, R.layout.list_item, new String[] {KEY_TITLE, KEY_DESCRIPTION, KEY_PODCASTURL}, new int[]{ R.id.title, R.id.description, R.id.podcasturl});
//adap = new CustomAdapter(this, menuItems);
setListAdapter(adap);
public static class CustomAdapter extends BaseAdapter implements Filterable{
private LayoutInflater mInflater;
private Context context;
public CustomAdapter(Context context, ArrayList<HashMap<String, String>> menuItems, int listItem, String[] strings, int[] is){
mInflater = LayoutInflater.from(context);
this.context = context;
}
public View getView(final int position, View convertView, ViewGroup parent){
ViewHolder holder;
if(convertView==null){
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.description=(TextView)convertView.findViewById(R.id.description);
holder.podcasturl=(TextView)convertView.findViewById(R.id.podcasturl);
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.downloadBTN=(Button)convertView.findViewById(R.id.btnStartDownload);
convertView.setOnClickListener(new OnClickListener(){
private int pos = position;
@Override
public void onClick(View v){
Toast.makeText(context, "Text-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();
}
});
holder.downloadBTN.setOnClickListener(new OnClickListener(){
private int pos = position;
@Override
public void onClick(View v){
Toast.makeText(context, "Button-"+String.valueOf(pos), Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
return convertView;
}
static class ViewHolder{
TextView description;
TextView title;
TextView podcasturl;
Button downloadBTN;
}
@Override
public int getCount() {
// Currently set to zero. If I set it to menuItems.size() it will crash the app.
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Filter getFilter() {
return null;
}
}
XML佈局 - list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dip">
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/startPodcastDownload"
android:layout_width="50dip"
android:layout_height="50dip"
android:focusable="false"
android:text="Download Podcast">
</Button>
</LinearLayout>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/LinearLayout01"
android:textColor="#acacac"
android:paddingBottom="2dip">
</TextView>
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/LinearLayout01"
android:layout_below="@id/title"
android:textColor="#acacac"
android:paddingBottom="2dip">
</TextView>
<TextView
android:id="@+id/podcasturl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/LinearLayout01"
android:layout_below="@+id/description"
android:textColor="#acacac"
android:paddingBottom="2dip">
</TextView>
</RelativeLayout>
感謝您的回覆。我做了上面列出的更改,並且它是一個NullPointerException: java.lang.NullPointerException at tv.undignified.android.Podcasts $ CustomAdapter.getView(Podcasts.java:150) at android.widget.AbsListView。 obtainView(AbsListView.java:1315) 在android.widget.ListView.measureHeightOfChildren(ListView.java:1198) 在android.widget.ListView.onMeasure(ListView.java:1109) 在android.view.View.measure( View.java:8171) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) – Fostenator 2012-07-27 04:10:59
已作出更改。仍然收到完全相同的錯誤。它幾乎看起來不能得到menuItems的大小? – Fostenator 2012-07-27 04:25:40
in getCount()嘗試通過Log.d(「size」,「」+ menuItems.size())查看menuItems的大小。 – AkashG 2012-07-27 05:25:40