2016-06-13 4 views
0

내 ListView에 아무것도 표시되지 않습니다.ListView에 아무것도 표시되지 않습니다.

Hacker-News에서 톱 스토리 API를 다운로드하고이를 내 앱에 넣습니다. 나는 그 이야기의 제목을 나의 목록보기에 넣고 싶다 (그들은 100 이상이다).

나는 그들을 다운로드하여 영구 저장을위한 데이터베이스에 저장 한 다음 내 목록보기에 추가하지만 아무 것도 내 응용 프로그램에 표시됩니다. 아무도 내게 왜 설명 할 수 있을까?

업데이트 : CursorIndexOutOfBoundException 문제가 발생합니다. (350 중 인덱스 350)

public class MainActivity extends AppCompatActivity { 

    ListView listView; 
    private SQLiteDatabase myDatabase; 
    private Cursor cursor; 

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

     listView = (ListView) findViewById(R.id.listView); 

     DownloadIDs ids = new DownloadIDs(); 
     String URL = "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"; 
     ids.execute(URL); 

     try { 

      ArrayList<String> titles = new ArrayList<String>(); 
      ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, titles); 
      listView.setAdapter(arrayAdapter); 

      myDatabase = this.openOrCreateDatabase("HackerNews", MODE_PRIVATE, null); 

      Cursor cursor1 = myDatabase.rawQuery("SELECT * FROM ids", null); 
      int index = cursor1.getColumnIndex("urlID"); 
      cursor1.moveToFirst(); 
      while (cursor1 != null) { 
       String newUrl = "https://hacker-news.firebaseio.com/v0/item/" + cursor1.getString(index) + ".json?print=pretty"; 
       new DownloadContent().execute(newUrl); 
       cursor1.moveToNext(); 
      } 

      Cursor cursor2 = myDatabase.rawQuery("SELECT * FROM content", null); 
      int titleIndex = cursor2.getColumnIndex("title"); 
      cursor2.moveToFirst(); 
      titles.add("Hello"); 
      while(cursor2 != null){ 
       titles.add(cursor2.getString(titleIndex)); 
       arrayAdapter.notifyDataSetChanged(); 
       cursor2.moveToNext(); 
      } 

     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public class DownloadIDs extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 

      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 
      try { 
       url = new URL(params[0]); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream inputStream = urlConnection.getInputStream(); 
       InputStreamReader reader = new InputStreamReader(inputStream); 
       int data = reader.read(); 

       while (data >= 0) { 
        char current = (char) data; 
        result += current; 
        data = reader.read(); 
       } 

       return result; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 

      try { 
       myDatabase.execSQL("CREATE TABLE IF NOT EXISTS ids (id INTEGER PRIMARY KEY, urlID VARCHAR)"); 
       cursor = myDatabase.rawQuery("SELECT COUNT(*) FROM ids", null); 
       cursor.moveToFirst(); 
       int count = cursor.getInt(0); 

       if (!(count > 0)) { 

        JSONArray ids = new JSONArray(s); 
        for (int i = 0; i < ids.length(); i++) { 
         myDatabase.execSQL("INSERT INTO ids (urlID) VALUES ('" + ids.getString(i) + "')"); 
        } 
       } 

      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

    public class DownloadContent extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 
      try { 
       url = new URL(params[0]); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream inputStream = urlConnection.getInputStream(); 
       InputStreamReader reader = new InputStreamReader(inputStream); 
       int data = reader.read(); 

       while (data >= 0) { 
        char current = (char) data; 
        result += current; 
        data = reader.read(); 
       } 

       return result; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 

      try { 
       myDatabase.execSQL("CREATE TABLE IF NOT EXISTS content(id INTEGER PRIMARY KEY, title VARCHAR, url VARCHAR)"); 
       cursor = myDatabase.rawQuery("SELECT COUNT(*) FROM content", null); 
       cursor.moveToFirst(); 
       int count = cursor.getInt(0); 

       if (!(count > 0)) { 

        JSONObject jsonObject = new JSONObject(s); 
        String title = jsonObject.getString("title"); 
        Log.i("title", title); 
        String url = jsonObject.getString("url"); 
        Log.i("url", url); 

        myDatabase.execSQL("INSERT INTO content (title, url) VALUES('" + title + "','" + url + "')"); 

       } 

      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

어떤 줄에 예외가 있습니까? –

+0

죄송합니다. onCreate 메서드에서 while 루프를 통해 얻습니다. –

답변

1

알 수 있습니다. 나는 그것을 고쳤다. 나는 뉴스의 양을 줄여야 만했다. (톱 20을 선택하기로 결정했다.) 내 앱에서 단 하나의 ASyncTask 만 실행하기로 결정했다.

PD : 여기

편집 된 코드입니다 @ cafebabe1991 덕분에 그는 나에게 그것을 해결하는 방법에 대한 도움말을 내 주면서. 감사!

public class MainActivity extends AppCompatActivity { 

    ListView listView; 
    private SQLiteDatabase myDatabase; 
    ArrayList<String> titles; 
    ArrayList<String> urls; 
    ArrayAdapter arrayAdapter; 

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

     listView = (ListView) findViewById(R.id.listView); 
     titles = new ArrayList<>(); 
     urls = new ArrayList<>(); 
     arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, titles); 
     listView.setAdapter(arrayAdapter); 

     try { 
      myDatabase = this.openOrCreateDatabase("HackerNews", MODE_PRIVATE, null); 
      DownloadTask downloadTask = new DownloadTask(); 
      String URL = "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"; 
      downloadTask.execute(URL); 

      Cursor cursor = myDatabase.rawQuery("SELECT * FROM content", null); 
      int titleIndex = cursor.getColumnIndex("title"); 
      int urlIndex = cursor.getColumnIndex("url"); 
      cursor.moveToFirst(); 
      while(cursor!=null){ 
       titles.add(cursor.getString(titleIndex)); 
       urls.add(cursor.getString(urlIndex)); 
       cursor.moveToNext(); 
      } 
      arrayAdapter.notifyDataSetChanged(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       Intent intent = new Intent(getApplicationContext(), MainActivity2.class); 
       MainActivity2.url = urls.get(position); 
       startActivity(intent); 
      } 
     }); 
    } 

    public class DownloadTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 

      String articleInfo = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 
      try { 
       url = new URL(params[0]); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream inputStream = urlConnection.getInputStream(); 
       InputStreamReader reader = new InputStreamReader(inputStream); 
       int data = reader.read(); 

       while (data >= 0) { 
        char current = (char) data; 
        articleInfo += current; 
        data = reader.read(); 
       } 

       //myDatabase.execSQL("CREATE TABLE IF NOT EXISTS ids (id INTEGER PRIMARY KEY, urlID VARCHAR)"); 
       myDatabase.execSQL("CREATE TABLE IF NOT EXISTS content (id INTEGER PRIMARY KEY, title VARCHAR, url VARCHAR)"); 
       myDatabase.delete("content", null, null); 
       JSONArray ids = new JSONArray(articleInfo); 

       for (int i = 0; i < 20; i++) { 
        //myDatabase.execSQL("INSERT INTO ids (urlID) VALUES ('" + ids.getString(i) + "')"); 

        String articleInfo2 = ""; 
        URL url2 = new URL("https://hacker-news.firebaseio.com/v0/item/" + ids.getString(i) + ".json?print=pretty"); 
        HttpURLConnection urlConnection2 = (HttpURLConnection) url2.openConnection(); 
        InputStream inputStream2 = urlConnection2.getInputStream(); 
        InputStreamReader reader2 = new InputStreamReader(inputStream2); 
        int data2 = reader2.read(); 

        while (data2 >= 0) { 
         char current2 = (char) data2; 
         articleInfo2 += current2; 
         data2 = reader2.read(); 
        } 

        JSONObject jsonObject = new JSONObject(articleInfo2); 

        String title = "'" + jsonObject.getString("title").replaceAll("'", "") + "'"; 
        String articleURL = "'" + jsonObject.getString("url") + "'"; 

        myDatabase.execSQL("INSERT INTO content (title, url) VALUES (" + title + "," + articleURL + ")"); 

       } 

       return null; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 

     } 
    } 
} 
0

문제는이 코드

1)

Cursor cursor1 = myDatabase.rawQuery("SELECT * FROM ids", null); 
     int index = cursor1.getColumnIndex("urlID"); 
     cursor1.moveToFirst(); 
     while (cursor1 != null) { 
      String newUrl = "https://hacker-news.firebaseio.com/v0/item/" + cursor1.getString(index) + ".json?print=pretty"; 
      new DownloadContent().execute(newUrl); 
      cursor1.moveToNext(); 
     } 

방법에있다?

당신은 열 색인을 가져오고 항목 ID를 가져 오는 것으로부터 커서를 가져 왔지만 데이터베이스가 비어 있으면 값은 null이됩니다. 따라서 API는 응답을 반환하지 않습니다. 또한 아래에서 언급 한 것과 같은 실수를 커서와 함께 수행합니다.

2)

int titleIndex = cursor2.getColumnIndex("title"); 
     cursor2.moveToFirst(); 
     titles.add("Hello"); 
     while(cursor2 != null){ 
      titles.add(cursor2.getString(titleIndex)); 
      arrayAdapter.notifyDataSetChanged(); 
      cursor2.moveToNext(); 
     } 

어떻게?

커서가 첫 번째 레코드 (moveToFirst())로 이동했는데 현재 레코드가없는 경우에는 무엇을 말했습니까? 이 메서드는 커서가 비어있는 경우 false를 반환합니다. 따라서이 메소드가 true를 리턴 한 다음 계속 진행하십시오.

또는

이 (더 나은 방법을) 수행 ...

while(cursor.moveToNext()) { 
    //If inside , that means you are on the next record.Fetch the column values here 
} 

참고 : Cursor methods

Discussion about best ways to iterate a cursor

For loading data into the listview from the database

+0

또한, cursor2를 사용하여 제목을 가져오고 그 후에 널이 아닌지 확인하게됩니다. 그건 나쁘다 ... 널 체크는 중복이다. – cafebabe1991

+0

null인지, 내 오류가 0에서 0으로 나오고 350에서 350이 아니라는 것을 알 수 있습니다.나는 네가 한 말을 시도했지만 여전히 동일하다. 아무 것도 내 목록보기에 나타나지 않습니다 –

+0

하나씩 디버깅 해보십시오. 우선 API에 대한 요청이 성공했는지 확인하십시오. 응답을 인쇄하고 그게 잘 작동하는지 확인한 다음 논리를 검증하는 두 번째 단계로 이동하십시오. – cafebabe1991

관련 문제