2014-05-11 3 views
0

"while"루프에서 두 번째 매개 변수를 가져 오는 어댑터가있어서 ListView에 쿼리 결과를 표시해야하지만 변수 "string_word"의 마지막 의미 만 보여줍니다 "대신. 하지만 log.d 라인까지 줄 단위로 출력합니다.ArrayAdapter를 사용하여 ListView의 라인 출력 라인

public class MainActivity extends Activity implements OnClickListener { 

final String LOG_TAG = "myLogs"; 

IdDB idh; 
SynDB sqh; 
SQLiteDatabase sqdb, iddb; 
Button btnOk; 
EditText etWord; 
String eWord; 
ListView lvMain; 
public ArrayAdapter<String> adapter; 



public String string_word; 
public String[] syns; 



public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    etWord = (EditText) findViewById(R.id.etWord); 
    btnOk = (Button) this.findViewById(R.id.btnOk); 
    lvMain = (ListView) findViewById(R.id.lvMain); 
    btnOk.setOnClickListener(btnOkListener); 

    //initialize our class-cover IdDB 
    idh = new IdDB(this); 

    // initialize our class-cover SynDB 
    sqh = new SynDB(this); 

    // we need db to read and write 
    sqdb = sqh.getWritableDatabase(); 
    iddb = idh.getWritableDatabase(); 





} 
    public void displayListView(){ 
     // создаем адаптер 
     adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, syns); 

    } 



    public OnClickListener btnOkListener = new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 

      eWord = etWord.getText().toString(); 



      switch (v.getId()){ 

       case R.id.btnOk: 

        String query = //long SQL query (return "word") 

        Log.d(LOG_TAG, query); 
        Log.d(LOG_TAG, "--- Rows in mytable: ---"); 

        // query to get Cursor 
        Cursor cursor = sqdb.rawQuery(query, null); 



        int wordColIndex = cursor.getColumnIndex(SynDB.Word); 
        while (cursor.moveToNext()) { 

        string_word = cursor.getString(wordColIndex); 
        Log.d(LOG_TAG, "word = "+ string_word); 
        syns = new String[] {string_word}; 
        displayListView(); 
        // присваиваем адаптер списку 
        lvMain.setAdapter(adapter); 

       } 

       cursor.close(); 


       break; 

       default: 
        break; 
      } // close switch 
     } // close onClick 
    }; 




protected void onStop() { 
    super.onStop(); 
    sqdb.close(); 
    sqh.close(); 
} 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 


@Override 
public void onClick(View view) { 

} 


} 

답변

1

그것이 무엇 :

  1. displayListView를 호출 string_word 하나 개의 항목 배열을 만들고 ListView

에 다른 어댑터를 설정하고 매번 내가 도착 할 여기에 코드입니다 리스트로부터의 값.

원하는대로하려면 로직을 약간 변경해야합니다.

  1. 어댑터를 한 번만 생성합니다. 당신은 그래서

(당신은 당신이 얼마나 많은 단어를 모르는 여기부터 배열보다 더 융통성)을 List에 모든 문자열을 추가합니다

  • 는 :

    모든 displayListView 메소드 호출을 삭제하고 추가 하나는 onCreate입니다. (모든 lvMain.setAdapter(adapter);)

    귀하의 displayListView 같은 ListView

    public void displayListView(){ 
        // создаем адаптер 
        adapter = new ArrayAdapter<String>(this, 
          android.R.layout.simple_list_item_1, syns); 
        lvMain.setAdapter(adapter); 
    } 
    

    뭔가에 어댑터를 설정하는 단 하나이어야한다 :

    public String[] syns; 
    
    입니다 상단에

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
    
        etWord = (EditText) findViewById(R.id.etWord); 
        btnOk = (Button) this.findViewById(R.id.btnOk); 
        lvMain = (ListView) findViewById(R.id.lvMain); 
        btnOk.setOnClickListener(btnOkListener); 
    
        //initialize our class-cover IdDB 
        idh = new IdDB(this); 
    
        // initialize our class-cover SynDB 
        sqh = new SynDB(this); 
    
        // we need db to read and write 
        sqdb = sqh.getWritableDatabase(); 
        iddb = idh.getWritableDatabase(); 
    
        displayListView(); 
    } 
    

    이동

    및 유형을으로 변경하십시오.(ArrayAdapter리스트와 생성자가, 너무 걱정하지 마십시오.) 여기

    public List<String> syns; 
    

    이제

    int wordColIndex = cursor.getColumnIndex(SynDB.Word); 
    while (cursor.moveToNext()) { 
    
        string_word = cursor.getString(wordColIndex); 
        Log.d(LOG_TAG, "word = "+ string_word); 
        syns = new String[] {string_word}; 
    } 
    

    당신이 List마다에 추가해야처럼

    int wordColIndex = cursor.getColumnIndex(SynDB.Word); 
    while (cursor.moveToNext()) { 
    
        string_word = cursor.getString(wordColIndex); 
        Log.d(LOG_TAG, "word = "+ string_word); 
        syns = new String[] {string_word}; 
        displayListView(); 
        // присваиваем адаптер списку 
        lvMain.setAdapter(adapter); 
    } 
    

    가 보일 것입니다 커서 반환 단어이므로 .add 메서드를 사용해야합니다.

    int wordColIndex = cursor.getColumnIndex(SynDB.Word); 
    while (cursor.moveToNext()) { 
    
        string_word = cursor.getString(wordColIndex); 
        Log.d(LOG_TAG, "word = "+ string_word); 
        syns.add(string_word); 
    } 
    

    준비가되면, 당신은 당신의 데이터를 변경 완료 어댑터에 통보 adapter.notifyDataSetChanged()를 호출하고 ListView

    의 항목을 다시 그릴 수 있습니다