即使添加了项目,也清空ListView

时间:2012-12-23 17:46:28

标签: android listview

我看到过类似的问题,但似乎没有一个像我一样,而且我无法理解答案,所以我希望你能帮助我。我所提到的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

1 个答案:

答案 0 :(得分:1)

根问题
我不相信我花了很长时间才注意到......但你需要使用vertical方向:

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

ListView一直在屏幕外。


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


或者,您可以在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(); } 应该有效。