使用ArrayAdapter在ListView中逐行输出

时间:2014-05-11 14:33:22

标签: android listview android-cursoradapter

我有一个适配器,从“while”循环获取第二个参数,所以它必须在ListView中显示一个查询结果,但它只显示变量“string_word”的最后含义。但即使log.d输出我想要的一行一行。这是代码:

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 个答案:

答案 0 :(得分:1)

它的作用:

  1. 创建一个包含string_word个调用displayListView项的数组,并将另一个适配器设置为ListView
  2. 每次我从列表中获取值时都会这样做。

    要做你想做的事,你应该改变你的逻辑。

    1. 您只需创建一次适配器。
    2. 您将每个字符串添加到List(比数组更灵活,因为您不知道您将拥有多少单词)
    3. 所以:

      删除所有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 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();
      }
      

      进入顶部

      public String[] syns;
      

      并将其类型更改为List<String>ArrayAdapter有一个包含List的构造函数,所以不要担心。)

      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};
          displayListView();
          // присваиваем адаптер списку
          lvMain.setAdapter(adapter);
      }
      

      应该看起来像

      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};
      }
      

      现在你应该向Cursor返回的每个单词添加List,所以你应该使用.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

      中的项目