0

関数内ArrayListの ListView のデータを含む を返す関数を設定し、 onPostExecute() 内に 設定しますdoInBackgroundAsyncTasknotifyDataSetCahnged()

しかし、配列リストにデータがあるにもかかわらず、データはリストビューに反映されませんか? なぜ ?

コード:

public class E0XMLParsing_RSSExampleActivity extends Activity {

    ListView lvFeeds;
    FeedsAdapter feedsAdapter;
    ArrayList<Feed> listOfFeeds;
    ProgressDialog progress;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listOfFeeds = new ArrayList<Feed>();
        lvFeeds = (ListView) findViewById(R.id.listFeeds);
        feedsAdapter = new FeedsAdapter(getApplicationContext(), R.layout.row, listOfFeeds);
        String url = "http://www.aljazeera.com/Services/Rss/?PostingId=200772215035764169";
        progress = ProgressDialog.show(this, "Aljazeera RSS", 
                                    "Please wait while downloading the RSS feeds ...");
        new DownloadRSS().execute(url);
    }


    private class DownloadRSS extends AsyncTask<String,Integer,ArrayList<Feed>>{

        @Override
        protected ArrayList<Feed> doInBackground(String... urls) {
            XMLParser parser = new XMLParser();

            return parser.getFeedsList(urls[0]);
        }

        protected void onPostExecute(ArrayList<Feed> listOfFeeds2){
            progress.dismiss();
            listOfFeeds = listOfFeeds2;
            feedsAdapter.notifyDataSetChanged();
        }

    }

フィードアダプター

public class FeedsAdapter extends ArrayAdapter<Feed>{

    public ArrayList<Feed> listOfFeeds= null;
    Context context;
    public FeedsAdapter(Context context,int textViewResourceId,ArrayList<Feed> feeds) {
        super(context,textViewResourceId,feeds);
        this.listOfFeeds = feeds;
        this.context = context;
    }

    @Override
    public View getView(int position, View view,ViewGroup parent){
        View v= view;
        if (v!=null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.row,null);
            Feed f = listOfFeeds.get(position);

            TextView lblTitle = (TextView) v.findViewById(R.id.lblTitle);
            TextView lblDescription = (TextView) v.findViewById(R.id.lblDescription);
            TextView lblDate = (TextView) v.findViewById(R.id.lblDate);

            lblTitle.setText(f.title);
            lblDescription.setText(f.description);
            lblDate.setText(f.date);
        }

        return v;
    }
4

3 に答える 3

4

呼び出すと、オブジェクトlistOfFeedslistOfFeeds = listOfFeeds2;への新しいオブジェクト参照が設定され、アダプタでnotifyDataSetChangedを呼び出すことができなくなります。これに対処するには、onPostExecuteで2つのことを行うことができます。

初め:

listOfFeeds.clear();
listOfFeeds.addAll(listOfFeeds2);
feedsAdapter.notifyDataSetChanged();

*このアプローチでは、listOfFeedsをクリアし、2番目のオブジェクトからアイテムをプッシュして、アダプターのデータオブジェクト参照を変更しないようにします。したがって、notifyDataSetChangedを呼び出してリストを更新する必要があります

2番:

feedsAdapter = new FeedsAdapter(getApplicationContext(),
       R.layout.row, listOfFeeds);
listOfFeeds.setAdapter(feedsAdapter);

*このアプローチでは、新しいアダプターを設定するだけです。したがって、ここでnotifyDataSetChangedを呼び出す必要はありません

于 2012-04-27T19:49:45.867 に答える
0

それがあなたの質問に答えるかどうかはわかりませんが、ListView を更新するには、最初にアダプターを更新し、次にアダプターを ListView に設定し、最後に ListView を再度描画する必要があります

ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, R.layout.simple_list_item_1, myNewStringArray);
myListView.setAdapter(myAdapter);
myListView.invalidate() //if you perform the re-draw in UI thread
// OR myListView.postInvalidate() if you perform the re-draw in non-UI thread
于 2012-04-27T19:56:40.550 に答える
-1

onPostExecute()、すべてのデータをrunOnUiThread()呼び出しに入れます。

runonuithread () {
    feedsAdapter.notifyDataSetChanged();
}
于 2012-04-27T19:34:11.900 に答える