How to set ScrollView in Activity with Multiple Li

2019-09-05 09:08发布

This is my actual Activity : enter image description here

In this Activity I set All the ListView(s) dynamically and programmatically. As you can see, the problem I have is The 1st ListView takes the place she needs and the second ListView try to keep showing by internally adding a scroll bar..

I just wanted to know how can I say programmatically to let all the ListView(s) take the entire place she needs and just add a ScrollBar to all the activity (To Scroll the Menu for example)?

Here is my Activity and my Adapter :

public class SousBoissonsActivity extends Activity {
    private String nom_categorie;
    private ArrayList<String> arraySousCategoriesName;
    private ArrayList<ArrayList<Drink>> arraySousCategories;
    private ArrayList<MyAdapter> myAdapters;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sousboissons_list_item);

        nom_categorie = getIntent().getStringExtra("nom_categorie");
        setTitle(nom_categorie);
        DrinksContainer.setSousCategoriesNameArray(nom_categorie);
        DrinksContainer.setSousCategoriesArray(nom_categorie);

        arraySousCategories = DrinksContainer.sousCategoriesArray;
        myAdapters = new ArrayList<MyAdapter>();

        new DoDirtyJobAsyncTask().execute();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

    private class DoDirtyJobAsyncTask extends AsyncTask<Void, MyAdapter, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            for (ArrayList<Drink> arrayElement : arraySousCategories) {
                MyAdapter myAdapter = new MyAdapter(getApplicationContext(),
                        arrayElement);
                myAdapters.add(myAdapter);
                publishProgress(myAdapter);
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(MyAdapter... myAdapters) {
            int currViewId = 1;
            LinearLayout ll = (LinearLayout) findViewById(R.id.sousboissons_linearlayout);
            for (MyAdapter myAdapter : myAdapters) {
                TextView sousCategorieTitle = new TextView(
                        getApplicationContext(), null);
                sousCategorieTitle.setText(myAdapter.sousCategory);

                sousCategorieTitle.setBackgroundColor(getResources().getColor(
                        R.color.green));
                sousCategorieTitle.setTextSize(19);
                sousCategorieTitle.setTextColor(getResources().getColor(
                        R.color.white));
                sousCategorieTitle.setGravity(Gravity.CENTER);
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.FILL_PARENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT);
                layoutParams.setMargins(0, 0, 0, 0);
                sousCategorieTitle.setLayoutParams(layoutParams);

                ListView listview = new ListView(getApplicationContext(), null);
                listview.setId(currViewId);
                listview.setAdapter(myAdapter);
                LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.FILL_PARENT,
                        LinearLayout.LayoutParams.FILL_PARENT);
                layoutParams2.setMargins(17, 0, 17, 0);
                listview.setLayoutParams(layoutParams2);

                ll.setPadding(15, 15, 15, 0);
                ll.addView(sousCategorieTitle);
                ll.addView(listview);
                currViewId++;
            }
        }

    }

    class MyAdapter extends ArrayAdapter<Drink> {
        LayoutInflater inflat;
        private ArrayList<Drink> items;
        private String sousCategory;

        public MyAdapter(Context context, ArrayList<Drink> objects) {
            super(
                    context,
                    R.layout.activity_sousboissons_list_item_elementsouscategorie,
                    objects);
            this.items = objects;
            this.inflat = LayoutInflater.from(context);
            this.sousCategory = objects.get(0).getType();
        }

        private class ViewHolder {
            public TextView title;
            public TextView prix;
            public TextView desc;
            public TextView size;
            public ImageView img;
            public LinearLayout ll;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            String currentKey = "";
            String keyDialog = "";
            ViewHolder holder = null;
            Drink element = items.get(position);

            // Instantiate Labels and Design
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflat
                        .inflate(
                                R.layout.activity_sousboissons_list_item_elementsouscategorie,
                                null);

                holder.title = (TextView) convertView
                        .findViewById(R.id.sousboissons_element_title);
                holder.desc = (TextView) convertView
                        .findViewById(R.id.sousboissons_element_desc);
                holder.prix = (TextView) convertView
                        .findViewById(R.id.sousboissons_element_prix);
                holder.size = (TextView) convertView
                        .findViewById(R.id.sousboissons_element_size);

                if (element.getPrice().size() > 1) {
                    holder.ll = (LinearLayout) convertView
                            .findViewById(R.id.sousboissons_element_firt_layout);
                    holder.img = new ImageView(getApplicationContext(), null);

                    LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT);
                    layoutParams1.weight = 12;
                    holder.title.setLayoutParams(layoutParams1);

                    LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT);
                    layoutParams2.gravity = Gravity.RIGHT;
                    layoutParams2.weight = 1;
                    holder.img.setLayoutParams(layoutParams2);
                    holder.img.setImageResource(R.drawable.arrow);
                    holder.img.setPadding(0, 15, 0, 4);

                    // Alert Dialog
                    final LinearLayout alertDialogLayout = new LinearLayout(
                            SousBoissonsActivity.this);
                    ArrayList<Dictionary> dico = element.getPrice();
                    ListView liste = new ListView(SousBoissonsActivity.this);
                    MyAdapterDialog adapt = new MyAdapterDialog(
                            SousBoissonsActivity.this, element.getPrice());
                    liste.setAdapter(adapt);
                    alertDialogLayout.addView(liste);
                    final AlertDialog.Builder alert = new AlertDialog.Builder(
                            SousBoissonsActivity.this);
                    alert.setTitle(element.getName());
                    alert.setCancelable(true);
                    alert.setPositiveButton("Retour",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    dialog.dismiss();
                                }
                            });
                    alert.setView(alertDialogLayout);

                    holder.img.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (alertDialogLayout.getParent() != null)
                                ((ViewGroup) alertDialogLayout.getParent())
                                        .removeView(alertDialogLayout);
                            alert.show();
                        }
                    });
                    holder.ll.addView(holder.img);
                } else {
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            // Setting Data on Labels
            if (element != null) {
                holder.title.setText(element.getName());
                holder.desc.setText(element.getDescription());

                if (element.getPrice().size() > 1) {
                    holder.prix.setVisibility(View.GONE);
                    holder.size.setVisibility(View.GONE);
                } else {
                    Dictionary dico = element.getPrice().get(0);
                    Enumeration e = dico.keys();
                    while (e.hasMoreElements()) {
                        currentKey = (String) e.nextElement();
                    }
                    if (currentKey.equalsIgnoreCase("0")) {
                        holder.size.setVisibility(View.GONE);
                        holder.prix
                                .setText((String) dico.get(currentKey) + "€");
                    } else {
                        holder.prix
                                .setText((String) dico.get(currentKey) + "€");
                        holder.size.setText(currentKey + "cl");
                    }
                }
            }
            return convertView;
        }
    }

2条回答
我想做一个坏孩纸
2楼-- · 2019-09-05 09:54

You should not nest ListViews inside a ScrollView, Android won't know which to scroll. Maybe... you will be able to set programatically the fixed height for each ListView, and then it will work.

What I would recommend is either to use a single ListView, and group in that list all the data, or to use an ExpandableListView.

查看更多
Fickle 薄情
3楼-- · 2019-09-05 09:56

Generally its a bad practice to add the ListView inside ScrollView. If you put your ListView or any scrollable View inside theScrollViewit won't work properly because when you touch the screen ,main focus of your touch is on parent view(ScrollView) not the child View (ListView`).

Still if you want to implement it then below is the way you can try out, which is to add the FooterView or HeaderView in your ListView.

Add views that should be above ListView as a header:

    addHeaderView(View v);

and that below as a footer:

    addFooterView(View v);

Put everything what should be above ListView to Header of ListView and the same with footer to add below.

LayoutInflater inflater = LayoutInflater.from(this);
mTop    = inflater.inflate(R.layout.view_top, null);
mBottom = inflater.inflate(R.layout.view_bottom, null);

list.addHeaderView(mTop);
list.addFooterView(mBottom);
// add header and footer before setting adapter
list.setAdapter(mAdapter);

In result you'll get one scrollable view.

查看更多
登录 后发表回答