カスタム配列アダプターを介してリストに入力するデータがない場合に備えて、リストビューにボタンを表示したかったのですが、データがあり、リストビューがデータ項目で満たされている場合はすべて正常に機能しますが、 listview は ID " @android :id/empty" の LinearLayout を表示する必要があることを示しますが、これは表示されず、この段階でアプリケーションがクラッシュしました。お気に入りのファイルが電話の内部メモリに存在する場合は、リストビュー用のアダプターを作成します。そうでない場合は、AsyncTask を停止し、ボタンだけでリスト ビューを表示します。doInBackground メソッドから戻った後、クラッシュして次のエラーが表示されます。
10-16 16:06:37.568: E/WindowManager(274): Activity com.example.hellogridview.FavoriteStudets has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44bfea80 that was originally added here
10-16 16:06:37.568: E/WindowManager(274): android.view.WindowLeaked: Activity com.example.hellogridview.FavoriteStudents has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44bfea80 that was originally added here
10-16 16:06:37.568: E/WindowManager(274): at android.view.ViewRoot.<init>(ViewRoot.java:227)
10-16 16:06:37.568: E/WindowManager(274): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
10-16 16:06:37.568: E/WindowManager(274): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-16 16:06:37.568: E/WindowManager(274): at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-16 16:06:37.568: E/WindowManager(274): at android.app.Dialog.show(Dialog.java:239)
10-16 16:06:37.568: E/WindowManager(274): at com.example.hellogridview.FavoriteStudents$readingFavFileTask.onPreExecute(FavoriteStudents.java:50)
10-16 16:06:37.568: E/WindowManager(274): at android.os.AsyncTask.execute(AsyncTask.java:391)
10-16 16:06:37.568: E/WindowManager(274): at com.example.hellogridview.FavoriteStudents.onCreate(FavoriteStudents.java:34)
10-16 16:06:37.568: E/WindowManager(274): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
10-16 16:06:37.568: E/WindowManager(274): at android.os.Handler.dispatchMessage(Handler.java:99)
10-16 16:06:37.568: E/WindowManager(274): at android.os.Looper.loop(Looper.java:123)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.main(ActivityThread.java:4363)
10-16 16:06:37.568: E/WindowManager(274): at java.lang.reflect.Method.invokeNative(Native Method)
10-16 16:06:37.568: E/WindowManager(274): at java.lang.reflect.Method.invoke(Method.java:521)
10-16 16:06:37.568: E/WindowManager(274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-16 16:06:37.568: E/WindowManager(274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-16 16:06:37.568: E/WindowManager(274): at dalvik.system.NativeStart.main(Native Method)
私のxmlファイル
<?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="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/studentsList"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:listSelector="@drawable/student_list_selector" >
</ListView>
<!-- empty view -->
<LinearLayout
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/addStudents"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Students" >
</Button>
</LinearLayout>
</LinearLayout>
My Student アダプター
public class StudentsAdapter extends ArrayAdapter<Students> {
private Context context;
ImageDownloaderNew imageDownloader;
ArrayList<Students> students;
Songs studentsTemp = null;
int targetWidth = 70;
int targetHeight = 110;
public StudentsAdapter (Context context, int textViewResourceId,
ArrayList<Students> students) {
super(context, textViewResourceId, songs);
// TODO Auto-generated constructor stub
this.context = context;
this.students= students;
imageDownloader = new ImageDownloaderNew();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return students.size();
}
@Override
public Students getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
static class ViewHolder {
protected TextView studentTitle;
protected RatingBar studentRating;
protected TextView studentViews;
protected ImageView studentImage;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//My getView code goes here.I have not pasted here
return convertView;
}
}
現在、FavoriteStudents.java クラス ファイル
public class FavoriteStudents extends SherlockActivity {
ListView list;
StudentsAdapter adapter;
ArrayList<Students> studentsListArray = new ArrayList<Students>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.students_list);
new readingFavFileTask().execute(UtilityFuctions.FAV_STUDENTS_FILE_NAME);
}
private class readingFavFileTask extends AsyncTask<String, Void, String> {
ProgressDialog m_dialog = new ProgressDialog(FavoriteStudents.this);
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
// initialize the dialog
m_dialog.setTitle("Loading...");
m_dialog.setMessage("Please wait while loading...");
m_dialog.setIndeterminate(true);
m_dialog.setCancelable(true);
m_dialog.show();
}
@Override
protected String doInBackground(String... params) {
if (!UtilityFuctions.isFileExists(getApplicationContext(),
params[0])) {
// favorite file does not exists
finish();
return "fileDoesNotExists";
}else{
StudentsListArray = UtilityFuctions.readFavJSONFile(
getApplicationContext(), params[0]);
if (isCancelled())
finish();
return null;}
}
@Override
protected void onPostExecute(String result) {
list = (ListView) findViewById(R.id.studentsList);
if (result.equals("fileDoesNotExists")) {
adapter = new StudentsAdapter(FavoriteStudents.this, 1,
studentsListArray);
list.setAdapter(adapter);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View myView = inflater.inflate(R.layout.empty_view, null);
list.setEmptyView(myView);
m_dialog.dismiss();
} else {
// Creating a StudentsAdapter and setting it on listview
adapter = new StudentsAdapter(FavoriteStudents.this, 1,
studentsListArray);
list.setAdapter(adapter);
m_dialog.dismiss();
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//onItemClick code goes here
}
});
}
}
}
}
EDIT:@Rolf Smithの答えは正しいです.しかし、主な問題は、doInBackground()メソッドでfinish()を呼び出していることです. みんな、ありがとう