Android 为什么我的ListActivity卡在/empty元素上?

Android 为什么我的ListActivity卡在/empty元素上?,android,listview,android-arrayadapter,listactivity,notifydatasetchanged,Android,Listview,Android Arrayadapter,Listactivity,Notifydatasetchanged,我正在尝试在我的Android应用程序上使用ListActivity,但它没有按应有的方式工作。 以下是我的活动: public class MainActivity extends ListActivity { public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_term


我正在尝试在我的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类TerminalsArrayAdapter扩展了ArrayAdapter{
私人活动mContext;
private ArrayList mObjects=new ArrayList();
公共终端阵列适配器(活动上下文){
超级(上下文、右布局、终端\列表视图\项目);
this.mContext=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图元素视图;
if(convertView==null){
LayoutInflater充气器=mContext.getLayoutInflater();
elementView=充气机。充气(R.layout.terminals\u listview\u项目,父项);
...
//有些事情与我的观点一致
}否则{
elementView=convertView;
}
...
//有些事情与我的观点一致
返回元素视图;
}
public void updateTerminals(ArrayList newObject){
mObjects.clear();
mObjects.addAll(newObject);
notifyDataSetChanged();
d(“TerminalArrayAdapter”,“数据集已更改!”);
}
}
下面是我的异步任务:

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);
    }
}
公共类RequestTask扩展了AsyncTask{
专用最终终端阵列适配器;
公共请求任务(TerminalArrayAdapter适配器){
mAdapter=适配器;
}
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
...
//从我的服务器检索一些数据
返回响应;
}
@凌驾
受保护的void onPostExecute(ArrayList响应){
Log.d(“response_server”,“明白了!”);
mAdapter.updateTerminals(响应);
}
}

据我所知,仅当适配器不为空时才会显示ListView。如果为空,将显示文本视图。

这就是我的应用程序的工作方式:
  • 应用程序将创建一个空适配器。这将显示“加载…”文本视图
  • 应用程序将创建一个新的异步任务,该任务将从我的服务器检索一些所需的数据
  • 当异步任务完成时,它将调用.updateTerminals()方法
  • 此方法将更新自定义适配器的条目并调用notifyDataSetChanged()
  • 应用程序现在应该显示包含新检索数据的ListView
  • 步骤1至4工作正常。问题发生在第5步:即使数据已经更新,我的应用程序也不会刷新屏幕以显示ListView,而是停留在“加载…”文本视图上

    我试图找出我的代码出了什么问题,但我没能找到。我很想听听你的建议/解决方案!谢谢


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

    您的
    列表视图
    高度应该是
    match\u parent

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

    • 显示文本视图&隐藏列表视图
    • 显示列表视图和隐藏文本视图
    公共类MainActivity扩展了ListActivity{
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_terminals_list);//特殊布局
    //用特定的方法创建你的列表,以便能够多次给她打电话
    //宁愿创建新数据,然后用新数据刷新
    CreateList(Passanydata);
    RequestTask任务=新的RequestTask(适配器);//异步任务
    task.execute(“/terminals/all”);
    }
    }
    公共void CreateList(ArrayList响应){
    TerminalArrayAdapter=新的TerminalArrayAdapter(此,响应);//自定义适配器
    setListAdapter(适配器);
    }
    @凌驾
    受保护的void onPostExecute(ArrayList响应){
    Log.d(“response_server”,“明白了!”);
    //获得新数据后,将其传递到列表中
    创建列表(响应);
    }
    公共类TerminalsArrayAdapter扩展了ArrayAdapter{
    私人活动mContext;
    private ArrayList mObjects=new ArrayList();
    公共终端ArrayAdapter(活动上下文、ArrayList对象){
    超级(上下文、右布局、终端\列表视图\项目);
    this.mContext=上下文;
    //当你有你的数据,它将能够使用它在这里
    this.mObjects=对象;
    }
    @凌驾
    公共视图getView(int位置、视图转换视图、视图组父视图){
    视图元素视图;
    if(convertView==null){
    LayoutInflater充气器=mContext.getLayoutInflater();
    elementView=充气机。充气(R.layout.terminals\u listview\u项目,父项);
    ...
    //有些事情与我的观点一致
    }否则{
    elementView=convertView;
    }
    ...
    //有些事情与我的观点一致
    返回元素视图;
    }
    }
    
    |移除
    终端阵列适配器=新终端阵列适配器(此);//自定义适配器setListAdapter(适配器)fom onCreate并将其放入onPostExecute。直接在onPostExecute中添加对象。从onPost | EExecute中删除
    mAdapter.updateTerminals(response)
    。尝试在列表视图中使用invalidate方法查看此消息:嗨!您在哪里定义CreateList?在一个单独的文件中?如果是,它是什么类型的文件?CraeteList是MainActivity中的方法
    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;
        }
    
    
    }