2017-04-21 67 views
0

我想在listview爲空時隱藏整個線性佈局? 我試過setEmptyView但我不需要的東西。如何在ListView數據爲空時隱藏線性佈局?

這裏我的ListView代碼: -

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_notification_task, container, false); 
    listschedule=(ListView)view.findViewById(R.id.notificationtaskschedule); 
    LinearLayout schduletasks=(LinearLayout)view.findViewById(R.id.sch); 
    new pendingscheduletask().execute(); 
     return view; 
} 
//daily task pending 
private class pendingdailytask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgressDialog = new ProgressDialog(getActivity()); 
     mProgressDialog.setTitle("Please Wait"); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.show(); 
    } 
    @Override 
    protected Void doInBackground(Void... args) { 
     try { 
      arraylist = new ArrayList<HashMap<String, String>>(); 

      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("username", suid)); 
      JSONObject json = jParser.makeHttpRequest(url_psendingdailytask, "GET", params); 

      int success1 = Integer.parseInt(json.getString("success4")); 
      Log.d("success4", json.toString()); 
      if (success1 == 0) { 
       Snackbar.make(view, "Not Data Found", Snackbar.LENGTH_LONG).show(); 
      } 
      if (success1 == 1) { 
       ownerObj = json.getJSONArray("daily"); 
       for (int i = 0; i < ownerObj.length(); i++) { 
        jsonobject = ownerObj.getJSONObject(i); 

        daily_task_name.add(jsonobject.getString("t_tname")); 
        daily_task_time.add(jsonobject.getString("t_time")); 
        daily_task_detail.add(jsonobject.getString("t_detail")); 
        daily_task_id.add(jsonobject.getString("t_id")); 
       } 
      } 
     } 
     catch(Exception e) 
     {} 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void args) { 
     listadapter = new ListViewAdapterPendingdailytask(getActivity(), daily_task_name,daily_task_time,daily_task_detail,daily_task_id); 
     listdaily.setAdapter(listadapter); 

     Utility.setListViewHeightBasedOnChildren(listdaily); 
    } 
} 
public static class Utility { 
    public static void setListViewHeightBasedOnChildren(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(0, 0); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
    } 
} 

這裏上面的代碼是當列表視圖中的數據是空的,我想隱藏線性佈局。我不知道如何執行這個任務。我嘗試了很多,但沒有得到excet輸出。

我嘗試setEmptyView在這個我可以把一個textview時,列表視圖爲空。但我想隱藏整個線性佈局。

+0

它是'schduletasks.setVisibility(View.GONE)'你丟失了嗎? – mVck

+0

我把這個放在哪裏? – Andie

+0

像我在f上試過這樣(listAdapter == null){ //先決條件 return; }在此但不在此 – Andie

回答

1

首先,您要設置基於在所有它的孩子身高的高度ListView,你爲什麼不只是它的設置身高到wrap_content

達到你想要什麼,你只需要做到這一點在onPostExecute

@Override 
protected void onPostExecute(Void args) { 
    //in this if clause make your logic between OR/AND depending on what you want 
    if(daily_task_name.size() != 0 || daily_task_time.size != 0 || ....){ 
     listadapter = new ListViewAdapterPendingdailytask(getActivity(), daily_task_name,daily_task_time,daily_task_detail,daily_task_id); 
     listdaily.setAdapter(listadapter); 
     Utility.setListViewHeightBasedOnChildren(listdaily); 
    } else{ 
     //assuming this is the LinearLayout you want to be gone 
     schduletasks.setVisibility(View.GONE); 
    } 
} 
1
LinearLayout schduletasks; 

...

@Override 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
View view = inflater.inflate(R.layout.activity_notification_task, container, false); 
listschedule=(ListView)view.findViewById(R.id.notificationtaskschedule); 
schduletasks=(LinearLayout)view.findViewById(R.id.sch); 
new pendingscheduletask().execute(); 
    return view; 

}

@Override 
protected void onPostExecute(Void args) { 
    listadapter = new ListViewAdapterPendingdailytask(getActivity(), daily_task_name,daily_task_time,daily_task_detail,daily_task_id); 
    listdaily.setAdapter(listadapter); 
    if(listAdapter == null) { 

     schduletasks.setVisibility(View.Gone); 

     } else{ 



    int totalHeight = 0; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listdaily); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams params = listdaily.getLayoutParams(); 
    params.height = totalHeight + (listdaily.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listdaily.setLayoutParams(params); 

     } 

} 
+0

如何在postexecute中直接設置可變性(不見)? – Andie

+0

yourView.setVisibility(View.GONE); –

+0

onPostExecute在Ui線程上運行,,這就是爲什麼我們可以改變該方法的可見性 –

0

我這個畫面,如下所示:enter image description here

因爲你是從AsyncTask您發佈加載操作加載數據可以在您已經實施的方法onPostExecute中完成,您唯一需要做的就是致電setVisibility(GONE)查看特定視圖。現在

linearLayout1.setVisibility(View.GONE) 

你的條件,用是否適配器是空的,因爲要取決於多個上daily_task_detail,你可以使用的方法大小找出羯羊或不是你的適配器將有數據。

旁註:

  • 我通常在生命週期的適配器在OnCreate(活動)或onActivityCreated(片段)設置,但最初的,以及當時剛剛修改的項有一種方法適配器確保它會調用notifyDataSetChangednotifyDataSetInvalidated

  • 不要叫像onBackground方法Snackbar.make(view, "Not Data Found", Snackbar.LENGTH_LONG).show();任何UI爲基礎的方法,不會發布到主線程。

  • 你可能知道tihs,但AsyncTask已經下了支持其他alternatives,IntentServices,RxAndroid,同步。