在自定义ListView中删除特定行

时间:2015-09-22 20:54:28

标签: android

我有一个CustomAdapter类,它在getView方法中指向4个小部件(3个TextViews和1个Button)。我希望能够在任何行中单击按钮并删除该特定行。我在Adapter类的getView方法中为我的Button设置了一个onClick方法。问题是,每次按下按钮,它都会删除创建的最后一行而不是我想要的特定行。这是我的getView方法:

    @Override
public View getView(final int position, final View convertView, ViewGroup parent) {
    View view = convertView;

    if (view == null){
        view = inflater.inflate(R.layout.contacts_custom_row,null);
        Button deleteBtn = (Button)view.findViewById(R.id.customRowDeleteButton);
        TextView name = (TextView)view.findViewById(R.id.customRowContactName);
        TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber);
        TextView email = (TextView)view.findViewById(R.id.customRowContactEmail);

        name.setText(names.get(position));
        phone.setText(phoneNumbers.get(position));
        email.setText(emails.get(position));

        phone.setOnClickListener(this);

        deleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              //This is the Issue I think, the position number
                names.remove(position);
                phoneNumbers.remove(position);
                emails.remove(position);
                notifyDataSetChanged();
            }
        });

    }
    return view;
}

3 个答案:

答案 0 :(得分:1)

试试这个......

@Override
        public View getView(final int position, final View convertView, ViewGroup parent) {
            final Holder holder;

            if (convertView == null) {
                 holder = new Holder();
                 convertView = ((LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.contacts_custom_row, parent, false);
                 holder.deleteBtn = (Button)convertView.findViewById(R.id.customRowDeleteButton);
                 holder.name = (TextView)convertView.findViewById(R.id.customRowContactName);
                 holder.phone = (TextView)convertView.findViewById(R.id.customRowContactNumber);
                 holder.email = (TextView)convertView.findViewById(R.id.customRowContactEmail);
                 convertView.setTag(holder);
             } else {
                 holder = (Holder) convertView.getTag();
             }

                holder.name.setText(names.get(position));
                holder.phone.setText(phoneNumbers.get(position));
                holder.email.setText(emails.get(position));
                holder.pos = position;

                holder.phone.setOnClickListener(this);

                holder.deleteBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        names.remove(holder.pos);
                        phoneNumbers.remove(holder.pos);
                        emails.remove(holder.pos);
                        notifyDataSetChanged();
                    }
                });

            }
            return convertView;
        }

        static class Holder{
            Button deleteBtn ;
            TextView name, phone, email;
            int pos;
        }

答案 1 :(得分:0)

声明全局变量int pos = 0;然后

更改此

TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber);
        TextView email = (TextView)view.findViewById(R.id.customRowContactEmail);

        name.setText(names.get(position));
        phone.setText(phoneNumbers.get(position));

到此

    TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber);
    TextView email = (TextView)view.findViewById(R.id.customRowContactEmail);
    pos = names.get(position);
    name.setText(names.get(position));
    phone.setText(phoneNumbers.get(position));

使用pos进入删除按钮侦听器,将其从列表中删除。问题是,如果您的列表从数据库填充,您必须从数据库中删除该项目,否则每次启动应用程序时,您删除的列表项仍将存在。

答案 2 :(得分:0)

请尝试使用onListItemClick。将其放在您声明Activity的{​​{1}}或Fragment内,而不是ListView

Adapter