0

我为我的列表视图做了一个自定义适配器,它扩展了一个基本适配器,它工作正常,直到我在我的 list_item.xml 中添加了另一行,所以现在在我的 OnItemClickListner 中,点击应该在它下面的行中显示项目的描述被隐藏了。效果很好,除了当我单击任何项​​目时,它会在列表底部显示描述下的行和列表底部的另一个项目,尽管我只按下一个项目,当我再次向下和向上滚动时,项目的行 a点击消失,但另一个自己打开的保持打开状态。我搜索并发现这可能是因为我不使用 bindView 并且任何 List 从 5-10 个项目中获取然后重用它们。如果是这种情况,我该如何为我的 customAdapter 实现 bindVIew。附加了我的点击监听器和我的 customAdapter 的 getView

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

                }

第二个问题:我的描述行有一个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。Baically 第一个 tableRow 显示了从 hashMap 数组传递的所有信息。第二排还没用。第三个 TableRow 从第一行获取信息并将其设置为 editText,然后可以对其进行修改,以便之后使用更正的信息更新数据库。第三行被隐藏并在按下项目时显示。

    <?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

虽然我只按下了一个项目,当我再次向下和向上滚动时,单击的项目行消失了,但另一个自行打开的项目保持打开状态。

您正在与 ListView 回收视图的方式作斗争,请观看 Google 的Turbo-Charge 您的 UI,以详细了解其工作原理。解决方案很简单:在您的适配器中,您必须记住哪些行已被展开并相应地设置它们getView() 默认折叠每一行。

但当它出现时,我无法按下它来更改或编辑它。

我注意到您正在使 EditText 可聚焦,请尝试更改setFocusableInTouchMode()。这些方法以微妙的方式联系在一起。


另外
我的一个观察是你有一些不必要的布局,如果一个布局只有一个孩子,那么你可能会删除它。例如,您可以删除 TableLayout 或 RelativeLayout 也可以删除 LinearLayoutedit或 TableRow。

完成后,我无法压制该项目以关闭或隐藏可扩展部分。

我没有看到为什么您不能触摸第一行或第二行中的任何内容以再次隐藏第三行的具体原因...也许您应该添加一个隐藏/显示此行的按钮/

我面临的是当我按下一个项目时打开的扩展部分在我向下滚动时消失了

我向另一个用户介绍了这个:Android:ListView bug
在我的回答中,请注意我如何使用expanded来跟踪每一行是否应该显示或隐藏额外的布局,并注意如何expandedmName.

于 2013-02-28T23:02:31.130 回答