【问题标题】:Why is my ListActivity stuck on the /empty element?为什么我的 ListActivity 卡在 /empty 元素上?
【发布时间】:2014-11-03 14:02:39
【问题描述】:


我正在尝试在我的 Android 应用程序上使用 ListActivity,但它没有按应有的方式工作。
这是我的活动:

public class MainActivity extends ListActivity {

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_terminals_list); //The special layout

        TerminalsArrayAdapter adapter = new TerminalsArrayAdapter(this); // A custom adapter
        setListAdapter(adapter);
        RequestTask task = new RequestTask(adapter); // An Async task
        task.execute("/terminals/all");
    }
}

这是我的布局:

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

    <ListView 
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

    <TextView
        android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Loading..." />
</LinearLayout>

这是我的自定义适配器:

public class TerminalsArrayAdapter extends ArrayAdapter<String[]> {

    private Activity mContext;
    private ArrayList<String[]> mObjects = new ArrayList<String[]>();

    public TerminalsArrayAdapter(Activity context) {
        super(context, R.layout.terminals_listview_item);
        this.mContext = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View elementView;

        if(convertView==null){
            LayoutInflater inflater = mContext.getLayoutInflater();
            elementView = inflater.inflate(R.layout.terminals_listview_item, parent);
            ...
            // Some things with my view

        } else {
            elementView = convertView;
        }

        ...
        // Some things with my view
        return elementView;
    }

    public void updateTerminals(ArrayList<String[]> newObject){
        mObjects.clear();
        mObjects.addAll(newObject);
        notifyDataSetChanged();
        Log.d("TerminalsArrayAdapter", "Dataset Changed !");
    }
}

这是我的异步任务:

public class RequestTask extends AsyncTask<String, Void, ArrayList<String[]>>{

    private final TerminalsArrayAdapter mAdapter;

    public RequestTask(TerminalsArrayAdapter adapter) {
        mAdapter = adapter;
    }

    @Override
    protected ArrayList<String[]> doInBackground(String... params) {

        ...
        // retrieve some data from my server
        return response;
    }

    @Override
    protected void onPostExecute(ArrayList<String[]> response) {
        Log.d("response_server","GOT IT !");
        mAdapter.updateTerminals(response);
    }
}


据我了解,仅当适配器不为空时才会显示 ListView。如果为空,则会显示 TextView。

这是我的应用程序应该工作的方式:

  1. 应用程序创建一个空适配器。这将显示“正在加载...” TextView
  2. 应用程序创建了一个新的异步任务,它将从我的服务器检索一些需要的数据
  3. Async 任务完成后,会调用 .updateTerminals() 方法
  4. 此方法将更新自定义适配器的条目并调用 notifyDataSetChanged()
  5. 应用程序现在应该显示带有新检索数据的 ListView
步骤 1 到 4 工作正常。问题出现在第 5 步:即使数据已更新,我的应用程序也不会刷新屏幕以显示 ListView 并停留在“正在加载...”TextView。

我试图弄清楚我的代码出了什么问题,但我无法弄清楚。我很想听听您的建议/解决方案!谢谢 !

PS:如果您需要任何东西来更好地理解我的问题,请告诉我。

【问题讨论】:

  • |从 onCreate 中移除 TerminalsArrayAdapter adapter = new TerminalsArrayAdapter(this); // A custom adapter setListAdapter(adapter); 并放入 onPostExecute。直接在 onPostExecute 中添加对象。从 onPost|EExecute 中删除 mAdapter.updateTerminals(response)
  • 尝试在列表视图上使用invalidate方法

标签: android listview android-arrayadapter listactivity notifydatasetchanged


【解决方案1】:

您的ListView 高度应为match_parent

尝试使用setVisibility(View.GONE)setVisibility(View.VISIBLE) 来玩:

  • 显示 TextView 和隐藏 ListView
  • 显示 ListView 并隐藏 TextView

【讨论】:

    【解决方案2】:
    public class MainActivity extends ListActivity {
    
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_terminals_list); //The special layout
            // create your list with specific method to be able call her many time
            // prefer to create then refresh with new data
             CreateList(Passanydata);
             RequestTask task = new RequestTask(adapter); // An Async task
                task.execute("/terminals/all");
    
        }
    }
    
    public void CreateList(ArrayList<String[]> response){
     TerminalsArrayAdapter adapter = new TerminalsArrayAdapter(this,response); // A custom adapter
                setListAdapter(adapter);
    
    }
    
    
    
     @Override
        protected void onPostExecute(ArrayList<String[]> response) {
            Log.d("response_server","GOT IT !");
          // after you got your new data , pass it to your list 
           CreateList(response);
        }
    
    
    
    
    public class TerminalsArrayAdapter extends ArrayAdapter<String[]> {
    
        private Activity mContext;
        private ArrayList<String[]> mObjects = new ArrayList<String[]>();
    
        public TerminalsArrayAdapter(Activity context,ArrayList<String[]> objects) {
            super(context, R.layout.terminals_listview_item);
            this.mContext = context;
            // when you have your data it will be able to use it here 
            this.mObjects  = objects;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View elementView;
    
            if(convertView==null){
                LayoutInflater inflater = mContext.getLayoutInflater();
                elementView = inflater.inflate(R.layout.terminals_listview_item, parent);
                ...
                // Some things with my view
    
            } else {
                elementView = convertView;
            }
    
            ...
            // Some things with my view
            return elementView;
        }
    
    
    }
    

    【讨论】:

    • 嗨!您在哪里定义 CreateList ?在单独的文件中?如果是,它是什么类型的文件?
    • CraeteList 是 MainActivity 中的方法
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2021-12-27
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多