0

コンテキストを台無しにしたと思います。誰かが私のコードを修正できますか? Context を lazyadapter に実装する方法がわかりません。私のLOGCATを見てください。ありがとう。

AndroidFragment.java

public class AndroidFragment extends SherlockListFragment  implements ActionBar.TabListener{

    static final String URL = "https://myxml.xml";
    static final String KEY_SONG = "song";
    static final String KEY_ID = "id";
    static final String KEY_TITLE = "title";
    static final String KEY_CAT_ARTIST = "artistcat";
    static final String KEY_DURATION = "duration";
    static final String KEY_THUMB_URL = "thumb_url";
    static final String KEY_CAT_URL = "cat_url";
    ArrayList<HashMap<String, String>> menuItems;
    ListAdapter adapter;
    Context appContext;
    ListView list;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        appContext = inflater.getContext().getApplicationContext();

        new loadListView().execute();   

    return super.onCreateView(inflater, container, savedInstanceState);
    }


    public class loadListView extends AsyncTask<Integer, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Integer... args) {
            // updating UI from Background Thread
            menuItems = new ArrayList<HashMap<String, String>>();


            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(URL); // getting XML
            Document doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_SONG);
            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                map.put(KEY_ID, parser.getValue(e, KEY_ID));
                map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                map.put(KEY_CAT_ARTIST, parser.getValue(e, KEY_CAT_ARTIST));
                map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
                map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
                map.put(KEY_CAT_URL, parser.getValue(e, KEY_CAT_URL));

                // adding HashList to ArrayList
                menuItems.add(map);
            }
                return null;
            }   


        @Override
        protected void onPostExecute(String args) {


            adapter=new MainPageLazyAdapter(appContext, menuItems);   
             list.setAdapter(adapter);
         }
    }


    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(android.R.id.content, this);

        ft.attach(this);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.detach(this);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

}

MainPageLazyAdapter.java

public class MainPageLazyAdapter extends BaseAdapter {

private Application activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public MainPageImageLoader imageLoader; 

public MainPageLazyAdapter(Context appContext, ArrayList<HashMap<String, String>> d) {
    activity = appContext;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new MainPageImageLoader(activity);
}

このエラーが発生しました:

Type mismatch: cannot convert from Context to Application
4

2 に答える 2

1

(Activity)コンストラクターで使用するキャストを削除します。inflator.getContext.getApplicationContextインスタンスを作成したときに既に使用しており、それをActivity再度コンテキストにキャストすることはできません。inflator.getContext()のみを渡す(コンテキストを使用Activityすると、メモリ リークが発生する可能性があります) か、コンテキストを使用するため、キャストApplicationを削除します。Activity

編集:

ApplicationContext は既にコンストラクターに渡されているため、再度 Activity にキャストする必要はありません。

activity = (Activity) appContext;

次に、アプリケーション コンテキストを再度取得します。

imageLoader=new MainPageImageLoader(activity.getApplicationContext());

設定activity = appContext;するだけで(変数はApplicationという名前にする必要があります)、直接渡しますimageLoader=new MainPageImageLoader(activity);

于 2012-10-06T08:21:44.130 に答える
1

MainPageLazyAdapterコンストラクターコードを見てください:activity = (Activity) appContext;
一方から - クラスAndroidFragment.onCreateView:appContext = inflater.getContext().getApplicationContext();


および in AndroidFragment.onPostExecute:
adapter=new MainPageLazyAdapter(appContext, menuItems);
so - Application Context を Activity にキャストしているため、キャスト エラーが発生します。

この状況を回避するには、メソッドをオーバーライドAndroidFragment.onAttachして にメンバーを 1 つ追加しAndroidFragmentます。

protected Activity fragmentActivity;    
@Override public void onAttach (Activity activity){
    fragmentActivity = activity;
}


次に置き換え
adapter=new MainPageLazyAdapter(appContext, menuItems);
ます
adapter=new MainPageLazyAdapter(fragmentActivity, menuItems);


そして ... に移動imageLoader=new MainPageImageLoader(activity.getApplicationContext());
することを検討してくださいonAttach()

于 2012-10-06T08:33:16.963 に答える