【问题标题】:Empty ListView even though item are added即使添加了项目,ListView 也是空的
【发布时间】:2012-12-24 20:54:53
【问题描述】:

我见过类似的问题,但似乎没有一个与我的完全一样,而且我无法理解答案,所以我希望你能帮助我。我所指的thread 以某种方式解决了异步任务或其他东西的问题,但我不确定那是什么。 我有一个问题,我有一个布局,它有一个 TextView 和一个 ListView。 ListView 和 TextView 都是动态更新的。根据我更新列表(并登录 LogCat)的方法,添加了条目。

12-23 18:31:03.185:D/FileHandle.readList(24083):读取 1 个条目

12-23 18:31:03.185:D/MainActivity.updateList(24083):更新列表,包含 1 个条目

但我只看到 TextView 而没有列表。 这是布局:

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

    <TextView android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txt_path"
        android:textSize="25sp" />

    <ListView android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:id="@+id/list"
        android:longClickable="true" >
    </ListView>
       <!--android:id="@android:id/list" />-->

</LinearLayout>

这里是读取和更新列表的代码:

private TextView mPathView;
private ListView mListView;
private String mPath;
private String mCurrentList;
private ArrayList<ListEntry> mList = new ArrayList<ListEntry>();
private ArrayAdapter<String> mAdapter;
private List<String> mListContent = new ArrayList<String>();


/**
 * Calls readList(mCurrentList)
 */
private void readList() {
    readList(mCurrentList);
}
/**
 * Reads items from list into mListContent
 * 
 * @param listName name of the list
 */
private void readList(String listName) {
    if (mCurrentList.compareToIgnoreCase(listName) != 0) {
        mPath += "/" + listName;
    }
    mCurrentList = listName;
    Log.d(TAG + ".readList", "Reading List " + listName);
    mList = FileHandle.readList(context, listName);
}
/**
 * Updates the list shown with the content of mListContent.
 */
private void updateList() {
    mListContent.clear();
    for (ListEntry e : mList) {
        mListContent.add(e.toString());
    }
    
    Log.d(TAG + ".updateList", "Updating List with " + mList.size() + " entries");
    mAdapter.notifyDataSetChanged();
}

FileHandle 中的静态方法正在运行。我之前在没有布局和没有 TextView 的情况下测试了代码,只有普通的 ListView,它可以工作。

这是我的 onCreate 方法

/**
 * (non-Javadoc)
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
public void onCreate(Bundle icicle) {
    Log.d(TAG + ".onCreate", "Launching Activity");
    super.onCreate(icicle);
    setContentView(R.layout.main_layout);
    
    MainActivity.context = getApplicationContext();
    mPathView = (TextView) findViewById(R.id.txt_path);
    mPath = mCurrentList = getString(R.string.rootlist);
    mListView = (ListView) findViewById(R.id.list);
    ListEntry.init(getApplicationContext());
    FileHandle.init(getApplicationContext());
    
    
    mAdapter = new ArrayAdapter<String>(this, 
                       android.R.layout.simple_list_item_1, mListContent);
    
    mPathView.setText(mPath);
    mListView.setAdapter(mAdapter);
    
    readList();
    updateList();
  }

如果有人能给我一个正确方向的提示,那就太好了!

You can only the see TextView, not the List

【问题讨论】:

    标签: android listview


    【解决方案1】:

    根本问题
    我不相信我花了这么长时间才注意到...但是您需要使用verticalorientation:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
    

    ListView 一直不在屏幕上。


    其他潜在问题
    在用setAdapter() 填充mAdapter 后,您需要将新的适配器传递给您的ListView。 notifyDataSetChanged() 在这种情况下不会做你想做的事。


    或者,您可以在onCreate() 中稍微更改代码的顺序:

    mAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, mListContent);
    
    mListView.setAdapter(mAdapter);
    
    readList();
    updateList();
    

    接下来将mListContent 设为列表:

    List<String> mListContent = new ArrayList<String>();
    

    终于换了updateList()

    private void updateList() {
        mListContent.clear();
        for (int i = 0; i < mList.size(); i++) {
            mListContent.add(mList.get(i).toString());
        }
    
        Log.d(TAG + ".updateList", "Updating List with " + mList.size() + " entries");
        mAdapter.notifyDataSetChanged();
    }
    

    按照这个顺序,notiftyDataSetChanged() 应该可以工作。

    【讨论】:

    • 我更新了代码,结果还是一样。 LogCat 显示一个加载的条目,但它仍然是一个空列表。我会更新原帖并添加截图。
    • 我更新了我的答案,我没有注意到 mListContent 是一个字符串数组。
    • 我把它改成了List,结果还是一样。而且我的 LogCat 仍然显示 1 个要读取的条目。还能是什么?现在,让我们假设我的 FileHandle 可能是错误的(即使它在没有布局的情况下工作)。我只是不想错过任何事情,因为我真的希望它能够发挥作用。您需要更多信息或代码吗?
    • 出于好奇,如果您使用原始代码但在updateList() 末尾调用mListView.setAdapter(mAdapter); 会发生什么?如果您仍然看不到这种方法的任何内容,则FileHandle.readList() 可能会返回一个空字符串...
    • 没有任何反应,再次使用:mAdapter = new ArrayAdapter&lt;String&gt;(this, android.R.layout.simple_list_item_1, mListContent); mListView.setAdapter(mAdapter); 我为FileHandle.readList(context, listName); 做了一个 LogCat 输出,输出为:12-24 00:01:16.045: D/MainActivity.readList( 31275): 项目名称: 测试 12-24 00:01:16.045: D/MainActivity.readList(31275): Itemamount: 100 k
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2018-05-05
    • 2021-12-01
    • 2014-01-13
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多