Je veux masquer la mise en page linéaire entière lorsque la liste est vide? J'ai essayé setEmptyView mais cette chose dont je n'ai pas besoin.

Voici ma listeVoir le code: -

  @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);
    }
}

Ici, le code ci-dessus est pour la liste lorsque les données sont vides, je veux masquer la disposition linéaire. je ne sais pas comment effectuer cette tâche. J'ai beaucoup essayé mais sans obtenir la sortie excet.

J'ai essayé setEmptyView dans ce que je peux mettre une vue de texte lorsque la liste est vide. mais je veux cacher la mise en page linéaire entière.

0
Andie 21 avril 2017 à 16:18

3 réponses

Meilleure réponse

Tout d'abord, vous définissez votre hauteur ListView en fonction de la hauteur de tous ses enfants, pourquoi ne pas définir sa hauteur sur wrap_content?

Pour réaliser ce que vous voulez, il vous suffit de le faire dans 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
Ricardo 21 avril 2017 à 13:39

J'imagine ceci comme suit: entrez la description de l'image ici

Puisque vous chargez vos données à partir d'une AsyncTask, l'opération de chargement peut être fait dans la méthode onPostExecute que vous avez déjà implémentée, la seule chose que vous devez faire est d'appeler setVisibility(GONE) pour une vue spécifique.

linearLayout1.setVisibility(View.GONE)

Maintenant, votre condition pour savoir si l'adaptateur est vide ou non car pour dépendre d'un multiple sur daily_task_detail, vous pouvez utiliser la taille de la méthode pour déterminer si votre adaptateur aura ou non des données.

Note latérale:

  • J'ai généralement un adaptateur défini dans onCreate (Activity) ou onActivityCreated (Fragment), mais tout d'abord dans le cycle de vie, puis modifiez simplement les éléments de l'adaptateur avec une méthode qui garantit qu'il appellera notifyDataSetChanged ou notifyDataSetInvalidated

  • N'appelez aucune méthode basée sur l'interface utilisateur comme Snackbar.make(view, "Not Data Found", Snackbar.LENGTH_LONG).show(); dans la méthode onBackground, sans la publier dans le thread principal.

  • Vous le savez peut-être, mais AsyncTask a été rejeté en faveur d'autres alternatives, IntentServices, RxAndroid, Sync.

0
Necronet 21 avril 2017 à 13:45
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); 

       }

}
1
Ara Hakobyan 21 avril 2017 à 13:50