【问题标题】:Android LazyAdapter for ListView用于 ListView 的 Android LazyAdapter
【发布时间】:2012-10-06 07:38:24
【问题描述】:

我想我搞砸了我的上下文。有人可以纠正我的代码吗?我似乎无法弄清楚如何将 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

【问题讨论】:

    标签: android android-lazyadapter


    【解决方案1】:

    删除您在构造函数中使用的(Activity) 演员表。您在创建实例时已经使用了inflator.getContext.getApplicationContext,并且不能再次将其转换为Activity 上下文。要么只传递 inflator.getContext()(如果使用 Activity 上下文,可能会出现内存泄漏),或者使用 Application 上下文,因此删除 Activity 演员表。

    编辑:

    您已经将 ApplicationContext 传递给构造函数,因此无需再次将其强制转换为 Activity:

    activity = (Activity) appContext;
    

    然后再次获取Application上下文:

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

    只需设置activity = appContext;(变量现在应该命名为Application)并直接传递imageLoader=new MainPageImageLoader(activity);

    【讨论】:

    • 谢谢,但我不明白你的意思是“或者你使用应用程序上下文,所以你删除了 Activity 演员”
    • 如果片段未附加,getActivity() 将返回 null.onCreateView。
    • 请检查。当我将变量更改为应用程序“类型不匹配:无法从上下文转换为应用程序”时出现此错误
    • 不,我只是指命名而不是类型。对不起,如果你误解了我。将活动保持为上下文类型(它指的是应用程序上下文而不是应用程序)
    【解决方案2】:

    查看MainPageLazyAdapter构造函数代码:activity = (Activity) appContext;
    从另一方面 - 类AndroidFragment.onCreateView: appContext = inflater.getContext().getApplicationContext();


    AndroidFragment.onPostExecute 中:
    adapter=new MainPageLazyAdapter(appContext, menuItems);
    所以 - 您正在将 Application Context 转换为 Activity,它会导致转换错误。

    为避免这种情况,您可能会覆盖 AndroidFragment.onAttach 方法并将一个成员添加到 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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多