Android 使用ArrayAdapter在ListView中逐行输出

Android 使用ArrayAdapter在ListView中逐行输出,android,listview,android-cursoradapter,Android,Listview,Android Cursoradapter,我有一个适配器,它从“while”循环中获取第二个参数,因此它必须在ListView中显示查询结果,但它只显示变量“string\u word”的最后一个含义。但即使是log.d也会逐行输出我想要的内容。代码如下: public class MainActivity extends Activity implements OnClickListener { final String LOG_TAG = "myLogs"; IdDB idh; SynDB sqh; SQLiteDatabase

我有一个适配器,它从“while”循环中获取第二个参数,因此它必须在ListView中显示查询结果,但它只显示变量“string\u 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) {

 }


}
public类MainActivity扩展活动实现OnClickListener{
最终字符串日志\u TAG=“myLogs”;
IdDB-idh;
SynDB-sqh;
sqlitedatabasesqdb,iddb;
按钮btnOk;
编辑文字;
弦埃沃德;
ListView lvMain;
公共阵列适配器;
公共字符串\u字;
公共字符串[]syns;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etWord=(编辑文本)findViewById(R.id.etWord);
btnOk=(按钮)this.findviewbyd(R.id.btnOk);
lvMain=(ListView)findViewById(R.id.lvMain);
setOnClickListener(btnoklListener);
//初始化我们的类覆盖IdDB
idh=新的IdDB(本);
//初始化我们的类cover SynDB
sqh=新SynDB(本);
//我们需要数据库来读写
sqdb=sqh.getWritableDatabase();
iddb=idh.getWritableDatabase();
}
public void displayListView(){
// создаем адаптер
适配器=新阵列适配器(此,
android.R.layout.simple_list_item_1,syns);
}
public OnClickListener btnOkListener=new OnClickListener(){
@凌驾
公共void onClick(视图v){
eWord=etWord.getText().toString();
开关(v.getId()){
案例R.id.btnOk:
字符串查询=//长SQL查询(返回“word”)
Log.d(日志标签,查询);
Log.d(Log_标记,“--”mytable中的行:--”;
//查询以获取游标
Cursor Cursor=sqdb.rawQuery(查询,空);
int-wordColIndex=cursor.getColumnIndex(SynDB.Word);
while(cursor.moveToNext()){
string\u word=cursor.getString(wordColIndex);
Log.d(Log_标签,“word=“+string_-word”);
syns=新字符串[]{String_word};
displayListView();
// присваиваем адаптер списку
lvMain.setAdapter(适配器);
}
cursor.close();
打破
违约:
打破
}//闭合开关
}//关闭onClick
};
受保护的void onStop(){
super.onStop();
sqdb.close();
sqh.close();
}
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共void onClick(视图){
}
}
它的作用:

  • 使用一个项目
    string\u word
    调用
    displayListView
    创建一个数组,并将另一个适配器设置为
  • 每次我从列表中得到一个值时都要这样做

    要想做你想做的事,你应该稍微改变一下你的逻辑

  • 您将只创建一次适配器
  • 您将把每个字符串添加到数组中(比数组更灵活,因为在这里您不知道将有多少个单词)
  • 因此:

    删除所有
    displayListView
    方法调用,并在
    onCreate
    中添加一个。(和每个
    lvMain.setAdapter(适配器);

    您的
    displayListView
    应该是唯一一个将适配器设置为

    到最上面去哪里

    public 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};
    }
    
    现在,您应该将光标返回的每个单词都添加到中,因此您应该使用
    .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()
    ,通知适配器您已完成更改数据,并可以在

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