Java ListView赢得';t从SQLite填充

Java ListView赢得';t从SQLite填充,java,android,xml,sqlite,listview,Java,Android,Xml,Sqlite,Listview,我遵循本教程: 试图从SQLite数据库中填充自定义的ListView,但它不会填充。我运行应用程序时没有错误。它只是无法填充。我已经看了很多次视频了——两次,三次检查代码都没有用。我还确保数据确实被插入到了数据库中——确实如此。我已经用SQLite浏览器检查过了 我试图使用display\u character\u row.xml在MainActivity.java中填充一个ListView,该视图由自定义边框char\u list\u border\u style.xml修改 我希望一些更有

我遵循本教程:

试图从SQLite数据库中填充自定义的
ListView
,但它不会填充。我运行应用程序时没有错误。它只是无法填充。我已经看了很多次视频了——两次,三次检查代码都没有用。我还确保数据确实被插入到了数据库中——确实如此。我已经用SQLite浏览器检查过了

我试图使用
display\u character\u row.xml
MainActivity.java
中填充一个
ListView
,该视图由自定义边框
char\u list\u border\u style.xml
修改

我希望一些更有经验的人能看看我,帮我摆脱困境

谢谢你抽出时间

以下是所有内容:

BackgroundTask.java

public class BackgroundTask extends AsyncTask <String,CharacterDisplay,String> {

Context ctx;
CharacterAdapter characterAdapter;
Activity activity;
ListView listView;
BackgroundTask(Context ctx) {
    this.ctx = ctx;
    activity = (Activity) ctx;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
    String method = params[0];
    DatabaseOperations databaseOperations = new DatabaseOperations(ctx);

    if (method.equals("add_info")) {
        String name = params[1];
        SQLiteDatabase db = databaseOperations.getWritableDatabase();
        databaseOperations.putInfo(db, name);
        return "One row inserted";

    } else if (method.equals("get_info")) {
        listView = (ListView) activity.findViewById(R.id.char_list);
        SQLiteDatabase db = databaseOperations.getReadableDatabase();
        Cursor cursor = databaseOperations.getInfo(db);
        characterAdapter = new CharacterAdapter(ctx, R.layout.display_character_row);
        String sName;
        while (cursor.moveToNext()) {
            sName = cursor.getString(cursor.getColumnIndex(TableData.TableInfo.NAME));
            CharacterDisplay characterDisplay = new CharacterDisplay(sName);
            publishProgress(characterDisplay);
        }
        return "get_info";
    }
    return null;
}

@Override
protected void onProgressUpdate(CharacterDisplay... values) {
    characterAdapter.add(values[0]);
}

@Override
protected void onPostExecute(String result) {
    if (result.equals("get_info")) {
        listView.setAdapter(characterAdapter);
    } else {
        Toast.makeText(ctx,result, Toast.LENGTH_LONG).show();
    }

}
}
CharacterAdapter.java

public class CharacterAdapter extends ArrayAdapter {
List list = new ArrayList();

static class CharacterHolder {
    TextView tx_name;
}

public CharacterAdapter(Context context, int resource) {
    super(context, resource);
}

public void add(Character object) {
    list.add(object);
    super.add(object);
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    CharacterHolder characterHolder;
    if (row == null) {
        LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = layoutInflater.inflate(R.layout.display_character_row, parent, false);
        characterHolder = new CharacterHolder();
        characterHolder.tx_name = (TextView) row.findViewById(R.id.char_name);
        row.setTag(characterHolder);
    } else {
        characterHolder = (CharacterHolder) row.getTag();
    }

    CharacterDisplay characterDisplay = (CharacterDisplay) getItem(position);
    characterHolder.tx_name.setText(characterDisplay.getdName().toString());
    return row;
}
}
CharacterDisplay.java

public class CharacterDisplay {

private String dName;

public CharacterDisplay(String dName) {
    this.setdName(dName);
}

public String getdName() {
    return dName;
}

public void setdName(String dName) {
    this.dName = dName;
}
}
MainActivity.java

public class MainActivity extends AppCompatActivity
    implements CreateNewChar_Fragment.OnFragmentInteractionListener {

public void onFragmentInteraction(Uri uri){

}

public void showCreateNewChar_Fragment() {
    android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    CreateNewChar_Fragment createNewChar_fragment = new CreateNewChar_Fragment();
    createNewChar_fragment.show(ft, "createnewchar_fragment");
}

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

    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.execute("get_info");

}

@Override
protected void onResume() {

    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.execute("get_info");

    super.onResume();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        startActivity(new Intent(this, Settings.class));
        return true;
    } else if (id == R.id.tabs) {

    }

    if (id == R.id.createcharacter) {
        showCreateNewChar_Fragment();
        return true;
    }

    if (id == R.id.rulebook) {
        startActivity(new Intent(this, Rulebook.class));
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}
activity_main.xml

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<ListView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/char_list" />

</RelativeLayout>

显示字符行.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="75dp" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="75dp"
    android:id="@+id/char_name"
    android:text=""
    android:textStyle="bold"
    android:gravity="center"
    android:textAppearance="?android:textAppearanceLarge"
    android:background="@drawable/char_list_border_style"
    android:layout_margin="5dp" />

</RelativeLayout>

char\u list\u border\u style.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<stroke
    android:width="3dp"
    android:color="#000000" />

<corners
    android:radius="10dp" />

<padding
    android:left="10dp"
    android:top="10dp"
    android:right="10dp"
    android:bottom="10dp" />

</shape>


您是否检查了
字符适配器
。它是否包含值?不确定这是否与您的问题有关,但不应在每个数据库中创建新的DatabaseOperations实例doInBackground@RandyFreak我试图将它移到外部,但它导致应用程序崩溃,出现AsyncTask错误#1。@PhanVănlin我正在查看代码,但我不确定你在说什么,我应该找。你愿意详细说明一下吗?
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<stroke
    android:width="3dp"
    android:color="#000000" />

<corners
    android:radius="10dp" />

<padding
    android:left="10dp"
    android:top="10dp"
    android:right="10dp"
    android:bottom="10dp" />

</shape>