【问题标题】:deleting a row in listView not working as expected删除 listView 中的一行未按预期工作
【发布时间】:2014-02-09 18:32:44
【问题描述】:

当用户单击我的自定义行视图中的 X 按钮时,我目前正在尝试删除我的 listView 中的一行。可悲的是,当我尝试使用 remove() 函数时,它似乎不起作用。我可以不正确地设置 ListView 的数据类型吗?目前,它使用 2 个按钮和一个 ImageButton 扩展了一个线性布局。 ImageButton 是 X 按钮。这是适配器。它扩展了 Classes 对象的 arrayAdapter。 (他们只持有 2 个字符串)所以 new Classes("", ""); 我是否告诉删除函数删除位置 0、1、2 等都没关系。它将始终删除列表中的最后一个位置。我做错了什么?

public PlannerListAdapter(Context context, ArrayList<String> rubric,
        SortedMap<String, String> currentTerms, ArrayList<String> termList, ArrayList<Classes> listItems) {
    super(context, R.layout.schedule_planner_list_item);

    this.context = context;
    this.rubricList = rubric;
    this.currentTerms = currentTerms;
    this.termList = termList;
    this.rubricList = rubric;
    courseHandler = new CourseHandler();
    courseDataTask = new GetCourseData();
    this.listItems = listItems;
    inflater = LayoutInflater.from(context);

}
static class ClassViewHolder {
    private Button rubric;
    private Button course;
    private ImageButton clearView;

    //pub constructor
    ClassViewHolder(Button rubric, Button course, ImageButton clearView) {
        this.rubric = rubric;
        this.course = course;
        this.clearView = clearView;
    }

    /**
     * @return the rubric
     */
    public Button getRubric() {
        return rubric;
    }
    /**
     * @param rubric the rubric to set
     */
    public void setRubric(Button rubric) {
        this.rubric = rubric;
    }
    /**
     * @return the course
     */
    public Button getCourse() {
        return course;
    }
    /**
     * @param course the course to set
     */
    public void setCourse(Button course) {
        this.course = course;
    }

    /**
     * @return the clearView
     */
    public ImageButton getClearView() {
        return clearView;
    }

    /**
     * @param clearView the clearView to set
     */
    public void setClearView(ImageButton clearView) {
        this.clearView = clearView;
    }
}


/* (non-Javadoc)
 * @see android.widget.ArrayAdapter#getCount()
 */
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return listItems.size();
}



/* (non-Javadoc)
 * @see android.widget.ArrayAdapter#getItem(int)
 */
@Override
public Classes getItem(int position) {
    // TODO Auto-generated method stub
    return listItems.get(position);
}

/* (non-Javadoc)
 * @see android.widget.ArrayAdapter#getPosition(java.lang.Object)
 */
@Override
public int getPosition(Classes item) {
    // TODO Auto-generated method stub
    return listItems.indexOf(item);
}

public int getViewTypeCount() {
    return 1;
}


/* (non-Javadoc)
 * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
 */
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    final Button rubric;
    final Button course;
    final ImageButton clearView;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.schedule_planner_list_item, null);
        rubric = (Button)convertView.findViewById(R.id.rubric_spinner);
        course = (Button)convertView.findViewById(R.id.course_spinner);
        clearView = (ImageButton)convertView.findViewById(R.id.clear_courseRubric_view);
        convertView.setTag(new ClassViewHolder(rubric, course, clearView));
    }
    else {
        ClassViewHolder viewHolder = (ClassViewHolder)convertView.getTag();
        rubric = viewHolder.getRubric();
        course = viewHolder.getCourse();
        clearView = viewHolder.getClearView();
    }

    rubric.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            RubricArray = rubricList.toArray(RubricArray);
            //Toast.makeText(context, rubricList.get(0), Toast.LENGTH_SHORT).show();
            AlertDialog.Builder rubricDialog = new AlertDialog.Builder(context);
            rubricDialog.setTitle("Pick a Rubric");
            rubricDialog.setItems(RubricArray, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, final int which) {
                    RubricString = RubricArray[which];
                    rubric.setText(RubricString);
                    notifyDataSetChanged();
                    currentSubject = RubricString;
                    courseList.clear();
                    CourseArray = courseList.toArray(CourseArray);
                    courseDataTask.execute();
                    courseHandler = new CourseHandler();
                    courseDataTask = new GetCourseData();
                }
            });

            rubricDialog.show();
        }

    });
    course.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            AlertDialog.Builder courseDialog = new AlertDialog.Builder(context);
            courseDialog.setTitle("Pick a Course") ;
            courseDialog.setItems(CourseArray, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    CourseString = CourseArray[which];

                    course.setText(CourseString);
                    notifyDataSetChanged();
                }
            });

            courseDialog.show();

        }
    });

    clearView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            listItems.remove(listItems.lastIndexOf(v);
            notifyDataSetChanged();
        }
    });
    return convertView;
}

【问题讨论】:

  • 我认为删除不起作用,因为它没有找到您在方法 lastIndexOf 中传递的视图,该方法需要类并且您正在传递一个视图,您是否尝试过硬编码索引?
  • 是的,我有。它仍然每次都删除最后一个视图。如果我输入 remove(0) ,它将删除最后一个位置。
  • 没关系,问题是您在 findlastindex 方法中寻找一个按钮,您在数组中拥有的按钮列表是什么?因为 onclick 在视图中返回对单击按钮的引用
  • no..我是说如果我用 0 替换 lastIndexof(v) 它也不起作用。我可以删除的 lastIndexOf 。我只是把它扔在那里。我希望它删除我指定的位置。

标签: android listview adapter


【解决方案1】:

因为我没有足够的声誉来评论您的问题,所以我写了这个。 我没有测试您的代码,但可能问题在于找到点击视图的索引。 我在问你为什么不使用位置来删除列表项,例如,

listItems.remove(position); then, 
notifyDataSetChanged(); 
or you can also use
listview.invalidateViews();

编辑:

add this line in (convertView == null) {} block.
clearView.setTag(position); then,

clearView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        listItems.remove(v.getTag());
        notifyDataSetChanged();
    }
});

【讨论】:

  • 使用位置的问题是它总是在listView的最后一个位置。
  • 哦,然后尝试将位置设置为 clearView 按钮上的标签并使用它来删除列表项,看看我已经再次编辑了我的答案。
  • 我的主要问题是,无论我在 remove() 中输入什么值,它总是会删除最后一行。我在想我以某种方式设置了 listView 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2011-08-06
  • 2017-02-15
相关资源
最近更新 更多