2012-07-27 87 views
1

我是一名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> 

回答

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

    @Override 
    public Object getItem(int position) { 

     return position; 
    } 

而且這些更改:

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(YourActivityName.this, menuItems); 

和創建適配器的構造函數:

public CustomAdapter(Context context, ArrayList<HashMap<String, String>> menuItems) 

您已經定義了適配器的數量爲0,所以如何將得到的list.Your應用程序崩潰,其確定的任意值,但你一定要得到這個錯誤的Log's。只需將錯誤粘貼到此處,無論您收到的列表是空還是因爲您必須獲得NullPointerException,因爲您必須獲得一些其他錯誤。

+0

感謝您的回覆。我做了上面列出的更改,並且它是一個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

+0

已作出更改。仍然收到完全相同的錯誤。它幾乎看起來不能得到menuItems的大小? – Fostenator 2012-07-27 04:25:40

+0

in getCount()嘗試通過Log.d(「size」,「」+ menuItems.size())查看menuItems的大小。 – AkashG 2012-07-27 05:25:40