【发布时间】: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。
这是我的应用程序应该工作的方式:
- 应用程序创建一个空适配器。这将显示“正在加载...” TextView
- 应用程序创建了一个新的异步任务,它将从我的服务器检索一些需要的数据
- Async 任务完成后,会调用 .updateTerminals() 方法
- 此方法将更新自定义适配器的条目并调用 notifyDataSetChanged()
- 应用程序现在应该显示带有新检索数据的 ListView
我试图弄清楚我的代码出了什么问题,但我无法弄清楚。我很想听听您的建议/解决方案!谢谢 !
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