fragmentlist中的按钮只响应一次,然后"发布"点击该行时

时间:2014-05-30 23:27:15

标签: android android-fragments android-listview

当我点击ListView中的按钮时,我看到吐司一次。当我单击远离按钮并且在ListView的空白区域中时,进一步的单击不会显示任何内容,所有先前未响应的按钮单击事件会立即出现(多个toast一个接一个地弹出)。知道如何解决这个问题吗?

    class Adapter extends ArrayAdapter
    {

        HashMap<Integer, View> rowViews = new HashMap<Integer, View>();

        public Adapter(Context context) {
            super(context, R.layout.manage_member_row, members);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final View rowView;
            if(rowViews.containsKey(position)) {
                rowView = rowViews.get(position);
            } else {
                rowView = inflater.inflate(R.layout.manage_member_row, parent, false);
                ((TextView) rowView.findViewById(R.id.manage_member_row_name)).setText(members.get(position).name);
                rowViews.put(position, rowView);
            }

            ((Button) rowView.findViewById(R.id.manage_member_row_delete)).setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getApplicationContext(), "btnclick", Toast.LENGTH_SHORT).show();
                }
            });
            Log.i("CRC", "called");
            return rowView;
        }




//manage_member_row.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_alignParentBottom="true"
    android:descendantFocusability="blocksDescendants"
    android:layout_alignParentLeft="true"
    android:layout_height="wrap_content"
    android:paddingTop="8dip"
    android:paddingBottom="8dip"
    android:background="#FFFFFF"
    android:orientation="vertical">

    <TextView
        android:id="@+id/manage_member_row_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="name"
        android:textSize="18sp"
        android:textColor="#53585E"
        android:gravity="center_vertical"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="15dp" />

    <Button
        android:id="@+id/manage_member_row_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="0dip"
        android:paddingBottom="0dip"
        android:paddingLeft="8dip"
        android:clickable="true"
        android:focusable="true"
        android:textSize="18sp"
        android:textColor="#4E4E4E"
        android:background="#EAEAEA"
        android:paddingRight="8dip"
        android:textStyle="bold"
        android:text="REMOVE"
        android:layout_alignParentRight="true"
        android:layout_marginRight="15dip" />
</RelativeLayout>






//fragment_manage_members.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="activities.ManageMembersActivity$PlaceholderFragment">

    <ListView
        android:layout_width="wrap_content"
        android:descendantFocusability="blocksDescendants"
        android:layout_marginTop="0dip"
        android:dividerHeight="2.0dip"
        android:divider="#EEEDF3"
        android:layout_height="wrap_content"
        android:id="@android:id/list" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

问题是,有时来自getView的位置没有同步在...之前有这个问题。

另请注意,您只使用HashMap<Integer, View>来检查视图是否已存在,这会占用大量内存并导致OutOfMemoryException ..

所以不要将它放在hashMap中,只需为所有视图创建一个ViewHolder。并将ViewHolder的对象添加到View的标记..

示例:

@Override
public View getView(int position, View view, ViewGroup viewGroup) {
    ViewHolder viewHolder = null;

    if(view == null)
    {
        viewHolder = new ViewHolder();
        view = mInflater.inflate(R.layout.chat_online_user_list_view_item, null);

        viewHolder.userName = (TextView) view.findViewById(R.id.chat_online_user_name);

        view.setTag(viewHolder);
    }
    else
        viewHolder = (ViewHolder) view.getTag();

    //DO THE ON CLICK LISTENER HERE

    return view;
}

private class ViewHolder
{
    private TextView userName;
}