0

この質問が何度か聞かれたことは知っていますが、解決策は質問者の問題に固有のものです。その結果、すべての提案に従ってみましたが、これらの解決策はどれも役に立ちませんでした。

だからここに行きます。

このような映画のアクティビティがあります。MoviesAdapterにデータを入力することになっている内部クラスがあることに注意してくださいmoviesDisplay ListView

package com.example.midtermexam;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.database.DataSetObserver;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MoviesActivity extends Activity {
    public String url;

    public ListView moviesDisplay;
    public static ArrayList<Movie> thisMovies;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movies);
        url=getIntent().getExtras().getString("url");
        moviesDisplay = (ListView)findViewById(R.id.listView1);
        new AsyncMoviesGet(this).execute(url);


    }

    public void populateListView()
    {


        Log.d("listview","adapter created");

        Log.d("listview","Listview declared");
        Log.d("listview","adapter populated");
        moviesDisplay.setAdapter(new MoviesListAdapter());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.movies, menu);
        return true;
    }

    private class MoviesListAdapter extends ArrayAdapter<Movie> {
        public MoviesListAdapter() {
            super(MoviesActivity.this, R.layout.movies_activity_listview, thisMovies);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Make sure we have a view to work with (may have been given null)
            View movieView = convertView;
            if (movieView == null) {
                movieView = getLayoutInflater().inflate(R.layout.movies_activity_listview, parent, false);
            }

            // Find the car to work with.


            return movieView;
        }               
    }

}

populateListView() メソッドは、AsyncMoviesGet という AsyncTask から呼び出されます。その postExecute() は次のようになります。

@Override
    protected void onPostExecute(ArrayList<Movie> result) {
        if(result != null){

            m.thisMovies = result;
            m.populateListView();
            Log.d("demo", result.toString());
        } else{
            Log.d("demo", "null result");
        }

    }

populateListView()メソッド内のログ メッセージを確認できます。これら 3 つのステートメントが実行されます。ただし、setAdapter()関数は " " 関数を呼び出していないようですGetView

4

3 に答える 3

0

カスタム アダプター クラスにコンストラクターを追加する必要があります。このコンストラクターは、コンテキスト、リソース ID、および表示するアイテム (この場合は thisMovies) を含むデータ構造を取ります。

public MoviesListAdapter(Context context, int resourceId, 
                         ArrayList<String> viewItems)
{
    super(context, resourceId, viewItems);
}

次に、onPostExecute() で受け取った結果に基づいてアダプターを構築する必要があります。これを行う前に、アダプタを格納するために使用されるインスタンス変数をアクティビティに作成します。

MoviesListAdapter mMovieAdapter = null;  

その後、これを変更して構築します

moviesDisplay.setAdapter(new MoviesListAdapter());

以下のようなものに

if(thisMovies != null && thisMovies.size() > 0) { 
    mMovieAdapter = new MoviesListAdapter(getApplicationContext(), R.layout.movies_activity_listview, thisMovies);
    moviesDisplay.setAdapter(mMovieAdapter);
} else { 
    Log.w("MyApplication","onPostExecute() did not return any items!");
}
于 2013-06-17T05:24:47.503 に答える
0

ArrayAdapter少なくともものを追加し、使用しますmAdapter.addAll()

private MoviesListAdapter mAdapter;

. . . . . .

@Override
protected void onCreate(Bundle savedInstanceState) {
  . . . . . 
  mAdapter = new MoviesListAdapter();
  moviesDisplay.setAdapter(mAdapter);

}

. . . . .

protected void onPostExecute(ArrayList<Movie> result) {
    if(result != null){

        m.thisMovies = result;

        mAdapter.clear();
        mAdapter.addAll(result);
        mAdapter.notifyDatasetInvalidated();

        Log.d("demo", result.toString());
    } else{
        Log.d("demo", "null result");
    }

}
于 2013-06-17T04:40:35.113 に答える
0

この方法でアダプターを初期化して呼び出す必要があります........これは、たとえば、コントロールに従って変更する必要があるだけです。

ListView lv = (ListView) v.findViewById(R.id.listview1);
    ListViewAdapter adapter = new ListViewAdapter(container.getContext(),
            android.R.layout.simple_list_item_1, R.id.textview1);
    adapter.notifyDataSetChanged();
    lv.setAdapter(adapter);

また、カスタム アダプター クラス内では、そのコンストラクターにも次の種類のパラメーターが必要です。

public ListViewAdapter(Context context,int resource, int textViewResourceId, List<YourObjectType> items) {
    super(context,resource,textViewResourceId, items);
    this.context1 = context;
    // TODO Auto-generated constructor stub
}
于 2013-06-17T06:01:06.447 に答える