【问题标题】:ListView shows no items from databaseListView 不显示数据库中的任何项目
【发布时间】:2018-01-25 19:24:13
【问题描述】:

我尝试了很多方法,但我得到了空白布局。我改变了很多行,但结果总是一样的。我是否应该重写代码并尝试不同的东西。我在 youtube 上关注了一些 视频,但没有人有合适的解决方案。我认为这不是因为数组得到了 null 结果。任何人都知道可能出了什么问题:

AirportTransportActivity

public class AirportTransportActivity extends AppCompatActivity {

ListView listView;
ArrayAdapter<String> adapter;
String[] data = new String[0];
JSONObject jsonObject = null;

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

    //Get airport details
    Intent intent = getIntent();
    String getairport = intent.getStringExtra("airport");

    final TextView textViewAirport = (TextView) findViewById(R.id.tvairport);
    textViewAirport.setText(getairport);

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());


    //List view setup
    listView = (ListView) findViewById(R.id.lvairport);

    //Get airport transport
    new RetrieveTask().execute();

    //Adapter
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
    listView.setAdapter(adapter);

}

private class RetrieveTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... voids) {
        String strUrl = "http://my database";
        URL url = null;
        StringBuffer sb = new StringBuffer();

        try {
            url = new URL(strUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream iStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
            String line = "";

            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }

            reader.close();
            iStream.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        try {

            JSONArray jsonArray = new JSONArray(result);

            data = new String[jsonArray.length()];

            for (int i = 0; i < jsonArray.length(); i++) {
                jsonObject = jsonArray.getJSONObject(i);
                data[i] = jsonObject.getString("airporttransportname");

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
adapter.notifyDataSetChanged();
    }
}

}

【问题讨论】:

  • 能否展示您从服务器获得的 JSON 结果示例?
  • [{"0":"1","id":"1","1":"BHX 伯明翰","机场":"BHX 伯明翰","2":"测试","airporttransportname":"test","3":"van","cartype":"van","4":"5","maxpeople":"5","5":"Birmingham i okolice ","区域":"伯明翰","6":"54321","联系人":"54321"},{"0":"2","id":"2","1":"BHX伯明翰","机场":"BHX 伯明翰","2":"test2","airporttransportname":"test2","3":"轿车","cartype":"轿车","4":"4 ","maxpeople":"4","5":"伯明翰","area":"伯明翰","6":"12345","contact":"12345"}]
  • 你的代码工作了吗?
  • 不,我现在很困惑,我发现重写代码是最好的选择。
  • 我对您的代码做了一些更改。试试看。如果您有任何问题,请告诉我。我现在不在我的开发计算机上,所以我无法测试它。

标签: java android listview android-arrayadapter


【解决方案1】:

在您的原始帖子中,您在添加数据之前设置了适配器。但我也怀疑您遇到以下问题: String[] data = new String[0];

所以我把它改成了 ArrayList&lt;String&gt; data = new ArrayList&lt;&gt;();

我还稍微更改了您的AsyncTask。现在您可以在后台线程中进行大部分解析。当doInBackground 成功时,只需将onPostExecute 中的更改通知适配器即可。

您还需要检查ArrayList&lt;String&gt; 是否适合您的适配器类。如果不只是根据需要更改它。

改为这样做:

public class AirportTransportActivity extends AppCompatActivity {

private static final String TAG = AirportTransportActivity.class.getSimpleName();

ListView listView;

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

    //Get airport details
    Intent intent = getIntent();
    String getairport = intent.getStringExtra("airport");

    final TextView textViewAirport = (TextView) findViewById(R.id.tvairport);
    textViewAirport.setText(getairport);

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());


    //List view setup
    listView = (ListView) findViewById(R.id.lvairport);

    //Get airport transport
    new RetrieveTask().execute();
}

private class RetrieveTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... voids) {
        String strUrl = "http://my database";
        URL url = null;
        StringBuffer sb = new StringBuffer();

        try {
            url = new URL(strUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream iStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
            String line = "";

            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }

            reader.close();
            iStream.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return toString();
    }

    @Override
    protected void onPostExecute(String result) {
        if(result.isEmpty()) return;
        try{
            ArrayList<String> data = new ArrayList<>();
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);

            JSONArray jsonArray = new JSONArray(result);
            int len = jsonArray.length();
            Log.e(TAG, "Lenth of json array = " + len)

            for (int i = 0; i < len; i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                // I add the optString variation just in case the data is corrupt
                String s = jsonObject.optString("airporttransportname", "?");
                data.add(s);
            }
            listView.setAdapter(adapter);            
        }
        catch(JSONException e){
            e.printStackTrace();
        }
    }
}

免责声明我是在文本编辑器中执行此操作的,并且无法指望某些语法或方法名称的“自动更正”——因此您需要检查它。 我会在您的代码中更改一些其他内容,但我想尽可能地使其接近原始代码。

【讨论】:

  • 有人想添加评论,说明为什么他们认为这个答案值得一票否决?
  • 应用在该行显示错误 JSONArray jsonArray = new JSONArray(result);
  • 我用它来检查数据是否已满,这就是我现在得到的: if(data == null){ Toast toast = Toast.makeText(getApplicationContext(), "Data is Empty",Toast .LENGTH_LONG); toast.show(); }else{ Toast toast = Toast.makeText(getApplicationContext(), "Data Full " + data + " ",Toast.LENGTH_LONG); toast.show(); } 结果是数据完整 []
  • @D.B. :: 奇怪的是,您现在应该在代码行中遇到错误。它和你的代码一样——我只是把它移到了 doInBackground 方法中。
  • 我重写了一半的代码,现在可以正常工作了,但是列表视图需要大量时间。
【解决方案2】:

您正在设置data 数组并在异步任务有机会完成之前调用notifyDataSetChanged()。您需要在异步任务的 onPostExecute() 方法中设置适配器和 notifyDataSetChanged()

需要明确的是,当您调用 asyncTask.execute() 时,它会启动异步任务,然后立即继续执行其余代码。因此,当您在列表视图适配器中设置 data 数组时,asyncTask 甚至还没有完成,并且您的数组项仍然为空。

【讨论】:

    【解决方案3】:

    无需更改任何内容,只需在将所有值存储到您的 array 后添加 adapter.notifyDataSetChanged();

    删除这行adapter.notifyDataSetChanged();in Oncreate,你 当您的数组列表值获取时,必须使用 notifyDataSetChanged() 改变了。

     @Override
        protected void onPostExecute(String result) {
    
            try {
    
                JSONArray jsonArray = new JSONArray(result);
    
                data = new String[jsonArray.length()];
    
                for (int i = 0; i < jsonArray.length(); i++) {
                    jsonObject = jsonArray.getJSONObject(i);
                    data[i] = jsonObject.getString("airporttransportname");
    
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            adapter.notifyDataSetChanged();
        }
    

    【讨论】:

    • 当然是最简单的。但是您可能想告诉 OP 他应该从他的 onCreate() 方法中删除 adapter.notifyDataSetChanged();,因为这是一个不必要的调用。
    • 更改已应用但仍无法正常工作。和以前一样
    • 现在它从 JSON 2 值中获取。我在我的问题下添加了 JSON 示例。
    • @D.B. jsonlint.com 在这里检查并告诉我您的回复是否有效...否则将您的 json 回复发布到您的问题中
    猜你喜欢
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多