2013-03-15 171 views
0

我正在閱讀HTML頁面,並從包含two colums的表中獲取值。這些值我需要插入到ListView如何從ArrayAdapter填充ListView

我很難理解ArraysArrayAdapter的概念,所以我試着通過閱讀各種代碼示例來闡述一些內容。我的代碼工作完美時,我靜態填充我的ArrayAdapter(在Java代碼中),但我需要使用循環(或東西?)填充數組的內容與我從HTML頁面中獲得的內容(所有這些代碼正常工作並就位)。

這是我使用的是什麼:

Ranking.java

public class Ranking { 
    public String month; 
    public String rank; 

    public Ranking() { 
     super(); 
    } 
    public Ranking(String month, String rank) { 
     super(); 
     this.month = month; 
     this.rank = rank; 
    } 
} 

此代碼:

Ranking ranking_data[] = new Ranking[] { 
    new Ranking("January 2013", "67"), 
    new Ranking("February 2013", "45"), 
} 

然後,我引用ranking_data用我自己的RankingAdapter;

RankingAdapter adapter = new RankingAdapter(this, R.layout.listview_item_row, ranking_data);

所以我的問題是;

如何動態填充ranking_data?

例如,此不是似乎工作以填充循環;

Ranking ranking_data[] = null; 
String mVal1, mVal2; 
while (myIterator1.hasNext() && myIterator2.hasNext()) { 
    mVal1 = myIterator1.next().text(); 
    mVal2 = myIterator2.next().text(); 
    new Ranking(mVal1, mVal2); 
} 

這使我對我的呼籲RankingAdapter adapter = new RankingAdapter(this, R.layout.listview_item_row, ranking_data);一個NullPointerException,也許是因爲我的ranking_data套初始化它null,但我應該怎麼否則初始化呢?

編輯
RankingAdapter聲明如下:

public class RankingAdapter extends ArrayAdapter<Ranking>是否有幫助?

編輯2

添加的代碼爲RankingAdapter.java

public class RankingAdapter extends ArrayAdapter<Ranking> { 
    Context context; 
    int layoutResourceId; 
    Ranking data[] = null; 

public RankingAdapter(Context context, int layoutResourceId, Ranking[] data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    RankingHolder holder = null; 

    if(row == null) { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new RankingHolder(); 
     holder.txtMonth = (TextView)row.findViewById(R.id.item_month); 
     holder.txtRank = (TextView)row.findViewById(R.id.item_rank); 

     row.setTag(holder); 
    } else { 
     holder = (RankingHolder)row.getTag(); 
    } 

    Ranking ranking = data[position]; 

    holder.txtMonth.setText(ranking.month); 
    holder.txtRank.setText(ranking.rank); 

    return row; 
} 
static class RankingHolder { 
    TextView txtMonth; 
    TextView txtRank; 
} 

}

+3

使用'型的ArrayList',如果你不知道你有多少個項目上榜,而不是陣列將在'ListView'中顯示。如果你知道數量的項目,那麼首先在添加項目之前定義'ranking_data'數組的大小 – 2013-03-15 17:57:38

+0

@ρяσѕρєяK我如何用'ArrayList'而不是Array來聲明排名?抱歉,當涉及到陣列和東西時總共有n00b。查看我的Edit,瞭解我的'RankingAdapter'是如何聲明的。 My RankingAdapter擴展了ArrayAdapter 。 – kaderud 2013-03-15 18:12:15

+0

http://stackoverflow.com/questions/15109406/how-to-set-json-parsed-data-in-a-listview-and-then-adding-search-functionality-i/15109592#15109592。檢查答案。而不是NewData有Ranking類。相應地修改代碼。 – Raghunandan 2013-03-15 18:24:01

回答

1

在你有wtitten的代碼中,你沒有向你的列表分配/添加數據,它只在第一時間初始化爲null,並且出錯。

你可以寫類似如下:

//declare arraylist 
ArrayList<Ranking> ItemArray = new ArrayList<Ranking>(); 
String mVal1, mVal2; 
while (myIterator1.hasNext() && myIterator2.hasNext()) { 
    mVal1 = myIterator1.next().text(); 
    mVal2 = myIterator2.next().text(); 
    //add item in your arrayList 
    ItemArray.add(new Ranking(mVal1, mVal2)); 
} 

不要忘記寫adapter.notifydatasetchanged(),如果你改變你的ListView

參考以下鏈接以獲得自定義陣列適配器列表視圖的清晰思路的內容:

http://www.vogella.com/articles/AndroidListView/article.html

+0

這是適合你的嗎? – 2013-03-15 19:03:05

+0

排序的,這不是完整的解決我的問題,它並沒有與解決我的問題了'RankingAdapter擴展ArrayAdapter ',但@ρяσѕρєяK解決了這個問題對我來說,如果他把它作爲一個答案,他將獲得接受答案獎勵。不過,他確實得到了部分解決它的積極因素,就像他也建議的那樣。 – kaderud 2013-03-15 22:49:43

0

初始化空集適配器,並更改收集的數據動態,後您將其更改爲調用Array Adapter

的notifyDatasetChanged方法