2012-02-25 14 views
3

私は文字列配列を持っていますが、これは外部のxmlレスポンスからフェッチされています。この文字配列はリストビューで表示できます。私は新しいXMLデータを文字列配列に追加し、ユーザーがリストビューの文字列配列の終わりの要素に達するたびにリストビューに追加したいと思います。どうすればこれを達成できますか?私はこのトピックについて多くのことを研究しました。この文脈に関連する例はほとんど見つかりませんでした。どんな助けでも大歓迎です。ありがとうございました。ダイナミックな文字列配列をアンドロイドの動的リストビューに追加する

ArrayList<String> get_msgList =MsgHandler.getMsgsList(); 
String[] msgList=new String[get_msgList.size()]; 
msgList=get_msgList.toArray(msgList); 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, get_msgList); 
myListView.setAdapter(adapter); 

これは、文字列配列を取得してリストビューに追加する方法です。

+0

他のデータとは具体的になりますか?すべてのデータはXMLファイルから来ますか? –

+0

@MattWolfeはいすべてのデータはxmlファイルから来ています。私はこのデータを解析し、それを文字列配列に格納しています。 – Dinesh

+0

どのくらいのデータですか?あなたが10,000以上の値を持っていないかぎり、私はすべてのファイルを先にロードする方が良いと思われます。各ファイルを読み込んでそのデータをArrayListに追加するだけです。そしてArrayAdapterでそのArrayListを使用してください。あなたがこれまでに行ったコードを見せてくれたら、助けてくれるように最善の方法を知っているので、もっと助けになるでしょう。 –

答えて

2

- アップデート、ドキュメントにより見た後、私はあなたがまだArrayAdapterを使用することができると思う -

ですから、listviewのドキュメントを見ればあなたが

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="countries_array"> 
     <item>Bahrain</item> 
     <item>Bangladesh</item> 
     <item>Barbados</item> 
     <item>Belarus</item> 
     <item>Belgium</item> 
     <item>Belize</item> 
     <item>Benin</item> 
    </string-array> 
</resources> 

を参照し、使用それらをロードするために:

setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, countries)); 

ここで問題となるのは、リストの最後に到達するタイミングと、さらにデータをロードする方法UIをブロックしません。

はこのように、自分自身に頭痛を大幅に節約するために、私はCommonsware Endless Adapter を使用することをお勧めします。このようにそれを行う: Android Endless List

import android.app.ListActivity; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import com.commonsware.cwac.endless.EndlessAdapter; 
import java.util.ArrayList; 

public class YourListActivity extends ListActivity { 
    @Override 
    public void onCreate(Bundle state) { 
    super.onCreate(state); 
    setContentView(R.layout.main); 
    String[] countries = getResources().getStringArray(R.array.countries_array); 
    setListAdapter(new YourAdapter(countries)); 
    } 

    class YourAdapter extends EndlessAdapter { 


    public YourAdapter(String[] list) { 
     super(new ArrayAdapter<String>(YourAdapter.this, 
             R.layout.row, 
             android.R.id.text1, 
             list)); 
    } 

    @Override 
    protected View getPendingView(ViewGroup parent) { 
     View row=getLayoutInflater().inflate(R.layout.row, null);  
     return row.findViewById(android.R.id.text1);  
    } 

    @Override 
    protected boolean cacheInBackground() { 
     SystemClock.sleep(10000);  // pretend to do work 
     //put logic here to fetch the data 
     //this happens in the background so you can't do anything with the UI 
     //return whether or not you have more data, true if you do false otherwise. 
     boolean haveMoreData = true;//this up to you to figure out 
     return haveMoreData; 
    } 

    @Override 
    protected void appendCachedData() { 
     //here is where you do the work to actually add the data obtained in cacheInBackground to the ArrayAdapter 
     ArrayAdapter<String> a=(ArrayAdapter<String>)getWrappedAdapter();   
     for (int i=0;i<25;i++) { 
      a.add(a.getCount()); 
     } 
     } 
    } 
    } 
} 

ここでは、ここにあなた自身に似ています別の質問です - 更新:アダプタに複数の文字列配列を追加する方法 - これを行うには複数の方法がありますが、最も簡単な方法はおそらくアダプタの追加メソッドを使用することです。

これを見て:http://developer.android.com/reference/android/widget/ArrayAdapter.html そしてメソッドaddを見てください。 は現在、あなたは、変数の名前のアダプタがあります。あなたはそのアダプタにデータを追加したいときはいつでも

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, get_msgList); 

を呼び出すだけ:

adapter.add("Some new data"); 

ですから、データの別のString []型の配列を持っていたし、あなたが望んでいた場合現在のアダプタにそのすべてを追加するために、ちょうど使用:

String[] someNewData = getStringArray();//no idea how you are getting the array, this is just an example 
    for (String s : someNewData) { 
     adapter.add(s); 
    } 

を、新しいデータを追加した後、あなたはadapter.notifyDataSetChangedを呼び出す必要があるかもしれませんが、私はSじゃありませんure(それはあなたのために起こるかもしれない)..私はそれを最初に試してみて、すべてが期待どおりに働いているかどうか、それを加えないかどうかを見ます。

アダプター変数をクラスのインスタンス変数にして、クラス内のどこでも使用できるようにします。

+0

私の問題は、アダプタに文字列配列を追加する方法です。 – Dinesh

+0

これを行う方法のコードスニペットを追加しました。 ArrayAdapterのaddメソッドを使用します。新しい配列をループし、文字列配列の各文字列値に対して、adapter.add(string)を呼び出します。 –

+0

私はちょうどあなたのコメントを読んでいます。あなたは間違いなくCommonsWareエンドレスアダプタを使用する必要があります。しかし、それはあなたがまだそれを試してみたいと思っている場合、あなたはまだ学習しているように見えます!あなたはその過程で多くを学ぶでしょう。 –

0

このリストビューに表示されるデータの量は不思議です。 onScrollListenerを実装する必要があると思われる情報から、それは、あなたがリストの一番下に来たときにもっと多くのデータを読み込むことを可能にするでしょう(facebookアプリのように)。 uiの読み込みに迷惑をかけないようにするMattの応答と同様に、uiスレッドの外にデータを読み込むためにスレッドを設定する必要があります。

外部ソースから読み込みを行うとき。これらはインターネット経由ですか?もしそうなら、上記の情報はあなたに正しい方向を指すはずです。外部から別のクラスを指しているのであれば、それらをすべて一緒にロードしたり、データベースに格納したり、カーソルを使って必要なものを取得するほうが良いでしょう。

+0

はいデータはhttp応答です。それ以来、それはインターネットから来ています。私はリストにダイナミックな感触を持たせたい。それが私がスクロールにデータを追加したい理由です。 – Dinesh

関連する問題