0

たくさんのアイテムを含むScrollViewがあります。その下部に、別のアクティビティからのアイテムのセットを追加します。別のアクティビティからの入力ArrayListを確認し、ScrollViewを使用してアクティビティに適切な数のチェックボックスを追加する必要があります。次のようなLinearLayoutを使用してアイテムを追加します。

  public void addFiles()
        {

            adapter = new ArrayAdapter<File>(this,
                    R.layout.new_order, R.id.fileCheck,
                    FileManagerActivity.finalAttachFiles) 
                    {
                @Override
                public View getView(final int position, View convertView, ViewGroup parent) {
                    // creates view

                    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    View view = inflater.inflate(R.layout.file, null);
                    view.setFocusable(false);
                    CheckBox textView = (CheckBox) view
                            .findViewById(R.id.fileCheck);
                    textView.setClickable(true);
                    textView.setText(FileManagerActivity.finalAttachFiles.get(position).getName().toString());
                    textView.setTextColor(Color.BLACK);
                    textView.setPadding(55, 0, 0, 0);
                    textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.file_icon, 0, 0, 0);
                    textView.setTextSize(16);
                    textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
                    int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
                    textView.setCompoundDrawablePadding(dp5);
                    textView.setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {


                            if(((CheckBox)v).isChecked()){
                              checks.set(position, 1);
                            }
                            else{
                             checks.set(position, 0);
                            }

                        }
                    });
                    return view;

                }
            };
}

ScrollView内でListViewを使用することはお勧めできませんが、LinearLayoutを目的に使用しようとしましたが、うまく機能しませんでした。正しく更新できませんでした。ListViewを適切な方法で表示するには、次のようなクラスを使用します。

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

        int totalHeight = 0;
        int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
        Log.i("ListAdapter count",Integer.toString(listAdapter.getCount()));
        for (int i = 0; i < listAdapter.getCount(); i++) {

            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }

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

そして、そのように変更されるすべてのデータの後にそれを使用してください:

fileList = (ListView) findViewById(R.id.fileListView);
    fileList.setAdapter(adapter);
    UtilityListView.setListViewHeightBasedOnChildren(fileList);

しかし、ListViewの高さは、リストのアイテムの数よりもはるかに大きいです...どうすれば修正できますか?

4

1 に答える 1

0

フッターとヘッダーを含むListViewを使用して問題を解決しました。ScrollView内でListViewを使用するすべての試みは、実行不可能または非効率的でした。私はこのようにしました:

    View header = getLayoutInflater().inflate(R.layout.header_listview, null);
    View footer = getLayoutInflater().inflate(R.layout.footer_listview, null);
    fileList.addHeaderView(header);
    fileList.addFooterView(footer);
    fileList.setCacheColorHint(Color.WHITE);
    fileList.setAdapter(adapter);

すべてのアイテムが正しく表示され、必要な機能を取得できます。

于 2012-09-04T12:24:09.573 に答える