2011-11-28 6 views
0

나는 ListView의가 빈 상태 ID @android:id/emptyViewStub에 팽창 시릴 Mottier에 의해 작성 guide 유용하게 사용할 수 있습니다. 이 방법은 모두 좋지만, 을 통해 연결된 어댑터가없는 ListActivity이 있거나 빈 어댑터가 연결된 경우 빈 화면이 나타납니다. 그것은 모든 분명하지만이 같은 논리를 실현하려면 :핸들 빈리스트와 AsyncTask를

  1. 열기를 ListActivity
  2. adapter
  3. AcyncTask을 실행하고 Adapter에 대한 데이터를 얻을
  4. 전화는
  5. 대화 기각 notifyDataSetChanged 대화 진행률을 표시 부착

다음 1 ~ 3 단계는 비워 보입니다. 오류가있는 y보기 (예 : "찾을 수 없음"). 하지만 난 AsyncTask 실행 후 쇼 오류 싶어요. 실행하는 동안 AsyncTask 나는 단지 프로세스 대화 상자를 보여주고 싶습니다. 재생 사용 빈도 옵션을 @android:id/empty으로 설정하려고 시도하면 xmlinclude을 사용해보세요. 그러나이 논리를 깨닫지 못합니다. 어떤 제안이라도 감사 할 것입니다.

UPD 더 자세한 정보 I가 activity.xml :

<FrameLayout 
    android:id="@id/gd_action_bar_content_view" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" > 

    <ListView 
     android:id="@android:id/list" 
     style="@style/listViewStyle" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:focusable="false" /> 

    <ViewStub 
     android:id="@android:id/empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     layout="@layout/error" /> 

</FrameLayout> 

error.xml :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center" 
android:orientation="vertical" 
android:padding="20dp"> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scaleType="centerInside" 
    android:src="@drawable/ic_cheese" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="8dp" 
    android:layout_gravity="center_horizontal" 
    android:gravity="center" 
    android:textStyle="bold" 
    android:textSize="16sp" 
    android:text="@string/no_cheese" /> 
</LinearLayout> 

ListActivity 클래스 :

public class MyListActivity extends ListActivity implements OnScrollListener, OnItemClickListener{ 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity); //inflate activity with ViewStub 
    mAdapter = new MyAdapter(this, Collections.EMPTY_LIST); 
    setListAdapter(mAdapter); 
    new SearchAndFill().execute(""); 
    } 
} 

그리고 비동기 클래스 : 활동이 만들고 activity.xml을 팽창 할 때 내가 빈보기를 볼 실행 AsyncTask 동안

private class SearchAndFill extends AsyncTask<String, Void, List<Object>>{ 
    LoadingDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     if (dialog==null){ 
      dialog = new LoadingDialog(MyListActivity.this); 
      dialog.setCancelable(false); 
     } 
     dialog.show(); 
    } 

    @Override 
    protected List<Object> doInBackground(String... str) { 
     return search(str[0]); //this is HTTP GET request 
    } 

    @Override 
    protected void onPostExecute(List<Object> result) { 
     super.onPostExecute(result); 
     dialog.dismiss(); 
     showResult(result); //this is fill adapter data and call notifyDataSetChanged 
    } 
} 

그것은, AsyncTask을 실행 한 후 빈과 쇼입니다. 전화 onPostExecuteAsyncTask의 경우 HTTP GET 요청 결과가 표시됩니다. activity.xml을 생성하고 비정상적으로 실행했을 때 빈 상태로 표시되면 AsyncTask을 실행하고 AsyncTask을 실행하면 빈보기가 표시됩니다. 전화 onPostExecuteAsyncTask의 경우 HTTP GET 요청 결과가 표시됩니다. 나는 그것이 틀렸다고 생각한다. AsyncTask가 실행되기 전에 빈 ListView를 표시하고 결과가 Collections.EMPTY_LIST와 같으면 이미지를 표시하고 싶습니다. (예 : 아무것도 찾지 못했습니다.)

+1

귀하의 질문을 수정하고 아마도 몇 가지 코드를 추가하는 것을 고려하십시오.이해하기가 쉽지 않다는 것을 발견하는 메신저 –

답변

0

나는 이것이 당신이 달성하고자하는 것입니다 이해로 ...

public class MyListActivity extends ListActivity implements OnScrollListener, OnItemClickListener{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); //inflate activity with ViewStub 
     ((ViewStub) findViewById(R.id.YOUR_VIEW_STUB_ID)).setVisibility(View.GONE); 
     mAdapter = new MyAdapter(this, Collections.EMPTY_LIST); 
     setListAdapter(mAdapter); 
     new SearchAndFill().execute(""); 
    } 
} 

... ... .... 

private class SearchAndFill extends AsyncTask<String, Void, List<Object>>{ 
LoadingDialog dialog; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    if (dialog==null){ 
     dialog = new LoadingDialog(MyListActivity.this); 
     dialog.setCancelable(false); 
    } 
    dialog.show(); 
} 

@Override 
protected List<Object> doInBackground(String... str) { 
    return search(str[0]); //this is HTTP GET request 
} 

@Override 
protected void onPostExecute(List<Object> result) { 
    super.onPostExecute(result); 
    if (result == null || result.size() == 0){ 
     mAdapter.notifyDataSetInvalidated(); 
     ((ViewStub) findViewById(R.id.YOUR_VIEW_STUB_ID)).setVisibility(View.VISIBLE); 
    } else { 
     // add stuff to mAdapter here... 
     mAdapter.notifyDataSetChanged(); 
    } 
    dialog.dismiss(); 
} 

}

+1

처음에 ViewStub를 보는 이유를 이해할 수 없더라도 가시성을 변경하거나 명시 적으로 infalte를 호출하면 풍선이 팽창됩니다. – gwa

+0

이 코멘트는 결정적입니다.'viewstub'에'android : id = "@android : id/empty"가 있으면 setContentView에 자동으로 표시됩니다. 마침내 적어도 약간의 움직임. 당신이 답안에 쓰여있는 것처럼한다면, 모든 것이 작동합니다. 그러나 비어 있지 않은 ViewStub은 모든 것을 포함합니다. – Mrusful

+0

도움이 되니 기쁩니다! – gwa

0

비어있는보기의 텍스트 값을 빈 문자열 ("") AsyncTask가 완료되면 텍스트 값을 오류 메시지로 변경하십시오.

호프가 문제를 해결하기를 바랍니다. 만큼