9

アイテムを動的に追加し、ListViewスクロールせずにすべてのアイテムを常に表示したいと考えています。

レイアウト コード:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/recipe_inside"
android:orientation="vertical" >

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="match_parent"
            android:layout_height="16dp"
            android:src="@drawable/head_cella" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="41dp"
            android:background="@drawable/body_cella"
            android:gravity="center_horizontal"
            android:paddingTop="5dp"
            android:text="Remember to save before leaving this page or inserted/modified data will be lost."
            android:textColor="#000000"
            android:textSize="13dp" />

        <ImageView
            android:id="@+id/ImageView01"
            android:layout_width="match_parent"
            android:layout_height="16dp"
            android:layout_marginTop="30dp"
            android:src="@drawable/head_cella" />

        <TextView
            android:id="@+id/TextView01"
            android:layout_width="wrap_content"
            android:layout_height="35dp"
            android:background="@drawable/body_cella"
            android:gravity="center_horizontal"
            android:paddingTop="10dp"
            android:text="Category"
            android:textColor="#000000"
            android:textSize="15dp" />

        <Spinner
            android:id="@+id/category_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <ImageView
            android:id="@+id/ImageView02"
            android:layout_width="match_parent"
            android:layout_height="16dp"
            android:layout_marginTop="30dp"
            android:src="@drawable/head_cella" />

        <TextView
            android:id="@+id/TextView02"
            android:layout_width="wrap_content"
            android:layout_height="35dp"
            android:background="@drawable/body_cella"
            android:gravity="center_horizontal"
            android:paddingTop="10dp"
            android:text="Name"
            android:textColor="#000000"
            android:textSize="15dp" />

        <EditText
            android:id="@+id/recipe_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Recipe title" android:lines="1"/>

        <ImageView
            android:id="@+id/ImageView03"
            android:layout_width="match_parent"
            android:layout_height="16dp"
            android:layout_marginTop="30dp"
            android:src="@drawable/head_cella" />

        <TextView
            android:id="@+id/TextView03"
            android:layout_width="wrap_content"
            android:layout_height="35dp"
            android:background="@drawable/body_cella"
            android:gravity="center_horizontal"
            android:paddingTop="10dp"
            android:text="Ingredients"
            android:textColor="#000000"
            android:textSize="15dp" />
         <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" android:cacheColorHint="#00000000" android:divider="#00000000"
            android:isScrollContainer="false"
            >
       </ListView>

         <Button
             android:id="@+id/button_ing"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="" android:background="@drawable/add_recipe_button" android:onClick="addItems"/>

    </LinearLayout>

</ScrollView></LinearLayout>

古い OnCreate() 関数コード:

protected void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);

    setContentView(R.layout.add_recipe_form);

    spinner = (Spinner)myhead.findViewById(R.id.category_spinner);

    Cursor cursor = mydb.getCategoriesList();
    ArrayList<Category> list = new ArrayList<Category>();
    list.add(new Category(0,"Choose a category"));

    while (cursor.moveToNext()) {
        list.add(new Category(cursor.getInt(0),cursor.getString(1))); 
    }
    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, list);

    // Step 3: Tell the spinner about our adapter
    spinner.setAdapter(spinnerArrayAdapter);   
    spinner.setOnItemSelectedListener(this);


    setListAdapter(adapter);
    ingredients.add((View)findViewById(R.layout.row_add_recipe));
    adapter.notifyDataSetChanged();
}

スピナーにデータベース データを入力することに関連するコードを移動すると、レイアウトに見つからないため、常に NullPointerException が返されます。したがって、ここに保持する必要があり、ListView に addHeaderView() を追加するソリューションは問題ないようですが、頭のレイアウトに関して別の NullPointerException があります。

protected void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);

    setContentView(R.layout.add_recipe_form);
    ListView mylistview = (ListView) findViewById(android.R.id.list);
    LinearLayout myhead = (LinearLayout)findViewById(R.id.linear_form);
    mylistview.addHeaderView(myhead);
    spinner = (Spinner)myhead.findViewById(R.id.category_spinner);

    Cursor cursor = mydb.getCategoriesList();
    ArrayList<Category> list = new ArrayList<Category>();
    list.add(new Category(0,"Choose a category"));

    while (cursor.moveToNext()) {
        list.add(new Category(cursor.getInt(0),cursor.getString(1))); 
    }
    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, list);

    // Step 3: Tell the spinner about our adapter
    spinner.setAdapter(spinnerArrayAdapter);   
    spinner.setOnItemSelectedListener(this);


    setListAdapter(adapter);
    ingredients.add((View)findViewById(R.layout.row_add_recipe));
    adapter.notifyDataSetChanged();
}
4

3 に答える 3

4

私があなたをよく理解していれば、リストビューと一緒にスクロール可能なビューがさらに必要です。addHeaderView()それを実装する最良の方法は、とaddFooterView()を呼び出すことですListView()

編集:

次のようになるはずです。

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_main_layout);
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View header = inflater.inflate(R.layout.your_header_layout); //R.layout, not R.id!

    (ListView) list = findViewById(android.R.list);
    list.addHeaderView(header);

    list.setAdapter(adapter); //according to docs you should call setAdapter() after addHeaderView()

    //to get the spinner
    (Spinner) spinner = (Spinner) header.findViewById(R.id.spinner);

}

私は記憶から書いており、テストしていませんが、うまくいくはずです。ちょっと気になったときに試してみてください。

于 2012-06-05T08:27:40.010 に答える
2

1 つの解決策は、ListView の高さをコンテンツと同じ大きさにすることです。ListView の代わりに次のクラスを使用して、この効果を実現できます。

public class ExpandedListView extends ListView {

  private int old_count = 0;

  public ExpandedListView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    if (getCount() != old_count) {
        old_count = getCount();
        int totalHeight = 0;
        int desiredWidth = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST);
        for (int i = 0; i < getCount(); i++) {
            View listItem = getAdapter().getView(i, null, this);
            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }

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

    super.onDraw(canvas);
  }

}

とにかく、ScrollView 内に ListView を配置するのは悪い考えなので、MichałK が指摘したように、メソッド addHeaderView() および addFooterView() を使用して、レイアウトに他の要素をヘッダー/フッター ビューとして追加します。

これらのメソッドの使用方法の例を次に示します。

https://github.com/commonsguy/cw-advandroid/tree/master/ListView/HeaderFooter

于 2012-06-05T07:41:10.387 に答える
1

ListView さをコンテンツのサイズよりも大きくします。

たとえば、高さが 20sp のリスト項目が5 つある場合、リスト ビューの高さを 100 以上に設定 すると、この方法で達成できます。

于 2012-06-05T08:18:57.867 に答える