2013-03-15 3 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"), 
} 

을 그리고 난 내 자신의 RankingAdapter으로 ranking_data를 참조;

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); 
} 

이 아마도 때문에 ranking_data 세트 내 초기화 그것을 null에, 나에게 RankingAdapter adapter = new RankingAdapter(this, R.layout.listview_item_row, ranking_data);에 내 전화에 NullPointerException을 제공하지만, 어떻게 그것을 달리 초기화해야합니까?

편집
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' 배열의 크기를 먼저 정의하십시오 –

+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()를 작성하는 것을 잊지 말아 :

아래 같은 것을 쓸 수 있습니다 : 당신은 당신이 얼마나 많은 항목 알려져 있지 않은 경우 대신 배열의 순위 유형의

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

+0

이 당신에게 적합합니까? –

+0

일종의, 내 문제에 대한 완전한 해결책이 아니었고,'RankingAdapter extends ArrayAdapter '로 내 문제를 해결하지 못했지만 @ ρяσѕρєяK이 문제를 해결해주었습니다. 그는 Accepted answer 보상을받을 것입니다. 당신은 그러나 부분적으로 그것을 해결하기위한 upvote를 얻었지만 그는 또한 제안했다. – kaderud

0

은 빈 컬렉션 어댑터를 초기화하고 후, 동적 컬렉션의 데이터를 변경 변경하면 Array Adapter

의 notifyDatasetChanged 메소드가 호출됩니다.
관련 문제