【问题标题】:no suitable constructor found for ArrayAdapter(MainListActivity.GetBlogPostsTask,int,String[])没有找到适合 ArrayAdapter(MainListActivity.GetBlogPostsTask,int,String[]) 的构造函数
【发布时间】:2015-09-02 10:06:38
【问题描述】:

我在运行此代码时收到此错误,我正在关注 treehouse Build a blog reader android app ,现在我收到此错误

错误:(120, 52) 错误: 没有找到适合 ArrayAdapter(MainListActivity.GetBlogPostsTask,int,String[]) 的构造函数 构造函数 ArrayAdapter.ArrayAdapter(Context,int,int) 不适用 (参数不匹配;MainListActivity.GetBlogPostsTask 无法转换为 Context) 构造函数 ArrayAdapter.ArrayAdapter(Context,int,String[]) 不适用 (参数不匹配;MainListActivity.GetBlogPostsTask 无法转换为 Context) 构造函数 ArrayAdapter.ArrayAdapter(Context,int,List) 不适用 (参数不匹配;MainListActivity.GetBlogPostsTask 无法转换为 Context)

现在我在这段代码中遇到了错误

private void udpateList() {
            if(blogData == null){
                // TODO: handle error
            }else{
                try {
                    JSONArray jsonPosts = blogData.getJSONArray("posts");
                    blogPostTitles = new String[jsonPosts.length()];
                    for (int i = 0; i < jsonPosts.length(); i++){
                        JSONObject post = jsonPosts.getJSONObject(i);
                        String title = post.getString("title");
                        title = Html.fromHtml(title).toString();
                        blogPostTitles[i] = title;
                    }
                    // !!!!!!!!!! getting error here !!!!!!!!!!!!!
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, blogPostTitles);
                    setListAdapter(adapter);
                } catch (JSONException e) {
                    Log.e(TAG, "Exception caught:", e);
                }
            }
        }

为了便于理解,我复制了整个代码,以防万一我遗漏了什么,我正在按照教程进行操作,而作者在我遇到错误时没有收到任何错误,可能是什么问题

package com.example.android.treehouseblogs;

import android.app.ListActivity;
import android.content.Context;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainListActivity extends ListActivity {

    protected String[] blogPostTitles;
    public static final int NUMBER_OF_POSTS = 20;
    public static final String TAG = MainListActivity.class.getSimpleName();
    protected JSONObject blogData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_list);

        if(isNetworkAvailable()){
            GetBlogPostsTask getBlogPostsTask = new GetBlogPostsTask();
            getBlogPostsTask.execute();
        }else{
            Toast.makeText(this, R.string.network_not_availabel,Toast.LENGTH_LONG).show();
        }

    }

    private boolean isNetworkAvailable() {
        ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        boolean isAvailable = false;
        if(networkInfo != null && networkInfo.isConnected()){
            isAvailable = true;
        }
        return isAvailable;
    }

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

    private class GetBlogPostsTask extends AsyncTask<Object, Void, JSONObject> {

        @Override
        protected JSONObject doInBackground(Object... params) {
            int responseCode = 1;
            JSONObject jsonResponse = null;
            try {
                URL blogFeedUrl = new URL("http://blog.teamtreehouse.com/api/get_recent_summary/?count=" + NUMBER_OF_POSTS);
                HttpURLConnection connection = (HttpURLConnection) blogFeedUrl.openConnection();
                connection.connect();
                responseCode = connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    Reader reader = new InputStreamReader(inputStream);
                    int contentLength = connection.getContentLength();
                    char[] charArray = new char[contentLength];
                    reader.read(charArray);
                    String responseData = new String(charArray);
                    jsonResponse = new JSONObject(responseData);
                }else{
                    Log.i(TAG, "Unsuccessful HTTP Response Code:" + responseCode);
                }
            } catch (MalformedURLException e) {
                Log.e(TAG, "Exception caught:", e);
            } catch (IOException e) {
                Log.e(TAG, "Exception caught:", e);
            } catch (Exception e) {
                Log.e(TAG, "Exception caught:", e);
            }
            return jsonResponse;
        }

        @Override
        protected void onPostExecute(JSONObject result) {
            blogData = result;
            udpateList();
        }

        private void udpateList() {
            if(blogData == null){
                // TODO: handle error
            }else{
                try {
                    JSONArray jsonPosts = blogData.getJSONArray("posts");
                    blogPostTitles = new String[jsonPosts.length()];
                    for (int i = 0; i < jsonPosts.length(); i++){
                        JSONObject post = jsonPosts.getJSONObject(i);
                        String title = post.getString("title");
                        title = Html.fromHtml(title).toString();
                        blogPostTitles[i] = title;
                    }

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, blogPostTitles);
                    setListAdapter(adapter);
                } catch (JSONException e) {
                    Log.e(TAG, "Exception caught:", e);
                }
            }
        }


    }
}

【问题讨论】:

  • 查看我的答案以了解详细信息。

标签: java android android-arrayadapter


【解决方案1】:

尝试:MainListActivity.this 而不是 this

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

您使用的ArrayAdapter 构造函数的第一个参数是Context 对象,在您创建ArrayAdapter 的上下文中,thisMainListActivity.GetBlogPostsTask 对象。

【讨论】:

  • 好的,但可能是什么原因,老师正在使用“this”并且它正在工作
  • @avinashizhere 我已经编辑了我的答案并试图解释异常。
  • 一般情况下,应在上下文参数处使用NameActivity.this
【解决方案2】:

ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, blogPostTitles)

当您编写此代码时,this 指的是内部类。 上下文应该是活动类。 我的建议是你检查你的右括号

【讨论】:

    【解决方案3】:

    你已经在你的内部类GetBlogPostsTask 中创建了这个方法udpateList() 因此第一个参数this 在这里不起作用

     new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, blogPostTitles);
    

    删除this,改用MainListActivity.this

    这里使用的ArrayAdpater类的重载构造函数应该是..ArrayAdapter(Context context, int resource, T[] objects)

    现在,Context 不能只是任何 java 类,它必须是 Android 系统特定的资源:

    根据API docs

    这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多