0

基本アダプターを拡張するリストビューのカスタムアダプターを作成しました。list_item.xmlに別の行を追加するまでは正常に機能していたので、OnItemClickListnerでクリックすると、その下の行にアイテムの説明が表示されます隠されていました。アイテムをクリックすると、説明の下の行とリストの一番下にある別のアイテムが表示されることを除いて、それは正常に機能しますが、1つのアイテムのみを押して、アイテムの行を上下にスクロールすると、クリックしたものは消えますが、それ自体で開いたものは開いたままです。検索したところ、bindView を使用しておらず、List が 5 ~ 10 個のアイテムを取得して再利用していることが原因である可能性があることがわかりました。その場合、どうすれば bindViewew を customAdapter に実装できますか。ataached s my on click listener と getView of my customAdapter

public void onItemClick(AdapterView<?> parent, View view,
             int position, long id) {
             // getting values from selected ListItem
                if ((((LinearLayout) view.findViewById(R.id.edit)).getVisibility()) == (View.VISIBLE))
                {
                    ((LinearLayout) view.findViewById(R.id.edit)).setVisibility(View.GONE);
                }else
                {
                    ((LinearLayout) view.findViewById(R.id.edit)).setVisibility(View.VISIBLE);
                    ((EditText) view.findViewById(R.id.itemn)).setFocusable(true);              
                    new LoadCategories().execute();

                }

2 番目の問題: 説明行には、項目を押したときに項目の下に表示される説明を示す editText があります。しかし、それを押して変更したり、表示されたときに編集したりすることはできません。

  public View getView(final int position, View convertView, ViewGroup parent) {
        System.out.println("getView " + position + " " + convertView);
        final ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(l, null);
            holder  = new ViewHolder();

            holder.id = (TextView)convertView.findViewById(R.id.id);
            holder.name = (TextView)convertView.findViewById(R.id.name);
            holder.price = (TextView)convertView.findViewById(R.id.price);
            holder.description = (TextView)convertView.findViewById(R.id.description);
            holder.button = (Button) convertView.findViewById(R.id.update);
            holder.btn = (Button) convertView.findViewById(R.id.order);

            holder.en = (EditText)convertView.findViewById(R.id.itemn);
            holder.ep = (EditText)convertView.findViewById(R.id.pri);
            holder.ed = (EditText)convertView.findViewById(R.id.descript);

            convertView.setTag(holder);
        }

        else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.id.setText(getId(getItem(position)));
        holder.name.setText(getName(getItem(position)));
        holder.price.setText("£ " + getPrice(getItem(position)));
        holder.description.setText(getDesc(getItem(position)));
        holder.btn.setVisibility(View.GONE);


       holder.en.setText((holder.name.getText()).toString());
       holder.ep.setText((holder.price.getText()).toString());
       holder.ed.setText((holder.description.getText()).toString());

        return convertView;
    }
    public void clear(){
        itemsList.clear();
        notifyDataSetChanged();
    }

}

これが私のlist_item.xmlです。基本的に最初の tableRow は、hashMap の配列から渡されたすべての情報を示します。2列目は未使用です。3 番目の TableRow は最初の行から情報を取得し、それを editText に設定します。これは後で変更できるため、後で修正された情報でデータベースを更新するために使用されます。3 行目は非表示で、項目を押すと表示されます。

    <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="5dp" >

<TableRow
    android:id="@+id/tableRow1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false" >

    <TextView
        android:id="@+id/id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="#FFFFFF"
        android:visibility="gone" />

    <TextView
        android:id="@+id/quantity"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="0.5"
        android:gravity="left"
        android:textAllCaps="true"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:textStyle="bold"
        android:typeface="serif"
        android:visibility="gone" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:layout_weight="3"
        android:gravity="left"
        android:textAllCaps="true"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:textStyle="bold"
        android:typeface="serif" />

    <TextView
        android:id="@+id/price"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="right"
        android:paddingRight="15dp"
        android:textAllCaps="true"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:textStyle="bold"
        android:typeface="serif" />

    <Button
        android:id="@+id/order"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_weight="0"
        android:focusable="false"
        android:minHeight="0dp"
        android:minWidth="50dp"
        android:text="+"
        android:textStyle="bold" />

</TableRow>

<TableRow
    android:id="@+id/tableRow2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/tableRow1"
    android:gravity="center_horizontal" >

    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="true"
        android:textColor="#FFFFFF"
        android:textSize="20sp"
        android:textStyle="bold"
        android:typeface="serif"
        android:visibility="gone" />

</TableRow>

<TableRow
    android:id="@+id/TableRow01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="false"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/tableRow2"
    android:gravity="center_horizontal" >

    <LinearLayout
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:visibility="gone" >

        <EditText
            android:id="@+id/itemn"
            android:layout_width="match_parent"
            android:layout_height="69dp"
            android:ems="10"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:gravity="top|left"
            android:hint="NAME"
            android:inputType="text"
            android:textColor="#FFFFFF"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/descript"
            android:layout_width="match_parent"
            android:layout_height="82dp"
            android:ems="10"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:gravity="top|left"
            android:hint="DESCRIPTION"
            android:inputType="textMultiLine"
            android:textColor="#FFFFFF"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/pri"
            android:layout_width="match_parent"
            android:layout_height="62dp"
            android:ems="10"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:gravity="top|left"
            android:hint="£ PRICE"
            android:textColor="#FFFFFF"
            android:textSize="20sp" />

        <Spinner
            android:id="@+id/spinne"
            style="@style/spinner_style"
            android:layout_width="352dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@drawable/dropdown"
            android:gravity="center"
            android:overScrollMode="always"
            android:prompt="@string/orders"
            android:textAlignment="center"
            android:textColor="#FFFFFF"
            android:textSize="20sp" />

        <Button
            android:id="@+id/update"
            android:layout_width="135dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.55"
            android:focusable="false"
            android:text="update"
            android:textAllCaps="true" />

    </LinearLayout>
</TableRow>

</RelativeLayout>
4

1 に答える 1

1

私は1つのアイテムだけを押しましたが、上下にスクロールすると、クリックしたアイテムの行が消えますが、それ自体で開いた他のアイテムは開いたままです。

ListView のリサイクル ビューの方法と戦っています。これがどのように機能するかの詳細な説明については、 Google のTurbo-Charge your UIをご覧ください。解決策は簡単です。アダプター内で、どの行が展開されたかを記憶し、それに応じて設定するgetView() 、デフォルトですべての行を折りたたむ必要があります。

しかし、それを押して変更したり、表示されたときに編集したりすることはできません。

EditText をフォーカス可能にしていることに気付きましたsetFocusableInTouchMode()。代わりに変更してみてください。これらのメソッドは微妙な方法でリンクされています。


追加
私が持っている1つの観察は、レイアウトに子が1つしかない場合、おそらく削除できる不要なレイアウトがあることです。たとえば、TableLayout または RelativeLayout削除したり、 LinearLayout または TableRow を削除したりできますedit

作業が終わった後、拡張可能な部分を閉じたり隠したりするために項目を押すことはできません。

1 行目または 2 行目に触れて 3 行目を再び非表示にすることができない特定の理由はわかりません...おそらく、この行を非表示/表示するボタンを追加する必要があります/

私が直面しているのは、アイテムを押すと開く展開部分が、下にスクロールすると消えることです

別のユーザーにこれを説明しました: Android: ListView のバグ
私の回答では、expanded各行が追加のレイアウトを表示または非表示にする必要があるかどうかを追跡するために使用する方法に注意を払いexpandedmName.

于 2013-02-28T23:02:31.130 に答える