0

これは私の実際の活動です: ここに画像の説明を入力

このアクティビティでは、すべての ListView を動的かつプログラム的に設定します。ご覧のとおり、私が抱えている問題は、最初の ListView が必要な場所を占め、2 番目の ListView が内部的にスクロール バーを追加して表示を維持しようとすることです。

すべてのListViewが必要な場所全体を取り、すべてのアクティビティにScrollBarを追加するようにプログラムでどのように言うことができるか知りたかっただけです(たとえば、メニューをスクロールするには)?

ここに私の活動と私のアダプタがあります:

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;
        }
    }
4

2 に答える 2

1

ListView一般に、 insideを追加するのは悪い習慣ScrollViewです。ListView or any scrollable View inside theScrollView it won't work properly because when you touch the screen ,main focus of your touch is on parent view(ScrollView ListViewを配置した場合) not the child View ()。

それでも実装したい場合は、次の方法を試すことができます。これは、FooterViewまたはに を追加することです。HeaderViewListView

ListViewヘッダーとして上にある必要があるビューを追加します。

    addHeaderView(View v);

以下はフッターです。

    addFooterView(View v);

ListView上にHeaderあるものをすべて入れてListView、フッターと同じものを下に追加します。

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

その結果、スクロール可能なビューが 1 つ得られます。

于 2013-03-28T11:52:35.740 に答える
1

Android はどちらをスクロールするかわかりませListViewsん。ScrollViewたぶん...それぞれの固定高さをプログラムで設定できるようにListViewなり、それが機能します。

私がお勧めするのは、単一ListViewの を使用し、そのリストですべてのデータをグループ化するか、ExpandableListView.

于 2013-03-28T11:04:30.200 に答える