2013-03-15 4 views
0

Я читаю HTML-страницу и получаю значения из таблицы, состоящей из two colums. Эти значения мне нужно вставить в ListView.Как заполнить ListView из ArrayAdapter

Мне трудно понять концепции Arrays и ArrayAdapter, поэтому я попытался что-то поделать, читая различные примеры кода.

Мой код отлично работает, когда я заполняю свой 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);

Так что мой вопрос;

Как заполнить rank_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); 
} 

Это дает мне NullPointerException на мой призыв к RankingAdapter adapter = new RankingAdapter(this, R.layout.listview_item_row, ranking_data);, возможно, потому, что моя инициализация ranking_data множеств это null, но как в противном случае я должен инициализировать его?

Редактировать
Мой RankingAdapter объявлен как это:

public class RankingAdapter extends ArrayAdapter<Ranking>, если это помогает?

Edit 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». если вы знаете количество элементов, тогда сначала определите размер массива 'rank_data' перед добавлением в него элементов –

+0

@ ρяσѕρєяK Как бы объявить ранжирование с помощью' ArrayList' вместо массива? Извините за то, что вы всего лишь n00b, когда дело доходит до массивов и т. Д. См. Раздел «Редактирование» о том, как объявлен мой «RankingAdapter». Мой RankingAdapter расширяет ArrayAdapter . – kaderud

+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

ответ

1

В коде, который вы указали, вы не назначали/добавляли данные в свой список, и он был инициализирован нулем только с первого раза и с ошибкой.

вы можете написать что-то, как показано ниже:

//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

см ссылку ниже, чтобы получить четкое представление о том, ListView с адаптером пользовательского массива:

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

+0

это работает для вас? –

+0

Сорт, это не было полным решением моей проблемы, это не решило мою проблему с «RankingAdapter extends ArrayAdapter ', но @ ρяσѕρєяK решил проблему для меня, поэтому, если он поставит ее в качестве ответа, он заработает вознаграждение за принятое решение. Тем не менее, вы все же получили преимущество, чтобы частично решить его, просто он предложил. – kaderud

0

инициализировать адаптер с пустой коллекции, а также изменять данные коллекции динамически, после вы меняете его называть метод notifyDatasetChanged для Array Adapter

Смежные вопросы