【问题标题】:How to delete a custom listview item in android?如何删除android中的自定义列表视图项?
【发布时间】:2012-05-05 21:18:26
【问题描述】:

我的布局文件中有一个列表视图和一个按钮。单击该按钮,我将项目添加到列表视图。活动开始时列表视图应该是空的,但它应该通过向其中添加项目来增长。 这是我在 onCreate() 中的代码:

list  = (ListView)findViewById(R.id.inverterListView);
adapter = new ArrayAdapter<String>(InverterList.this, R.layout.inverters_list_row, R.id.inverterNumberTextViewInPanelListRow);
 list.setAdapter(adapter); 

在这里我将项目添加到列表视图中单击按钮。

adapter.add(inverterNo);
adapter.notifyDataSetChanged();

这很好用。谁能指导我删除自定义列表视图项?提前致谢。

【问题讨论】:

    标签: android android-listview android-arrayadapter


    【解决方案1】:

    如果您知道项目的位置,您可以这样做:

    Object item = adapter.getItem(position);
    
    adapter.remove(item);
    
    adapter.notifyDataSetChanged();
    

    【讨论】:

    • 我为下面的自定义适配器添加了一些代码......只为需要类似东西的人。 ListViews 或多或少由开发人员定制,以使它们更漂亮。当这种情况发生时,事情就会发生变化......看看下面的答案。
    【解决方案2】:

    您可以编写自己的适配器扩展 BaseAdapter 并实现所有您需要的方法。

    这是我的适配器的例子:

    public class PeopleUserAdapter extends BaseAdapter 
    {
    private List<User> users;
    private int viewResourceId;
    private Context context;
    
    public PeopleUserAdapter(Context context, int viewResourceId) 
    {
        this.context = context;
        this.viewResourceId = viewResourceId;
        this.users = new ArrayList<User>();
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        UserItemHolder holder;
        if (convertView == null)
        {
            convertView = LayoutInflater.from(context).inflate(viewResourceId, parent, false);
            holder = new UserItemHolder(convertView);
        }
        else holder = (UserItemHolder) convertView.getTag();
    
        User user = getItem(position);
        holder.name.setText("@" + user.getLogin());
        return convertView;
    }
    
    @Override
    public int getCount() 
    {
        return users.size();
    }
    
    @Override
    public User getItem(int position) 
    {
        return users.get(position);
    }
    
    @Override
    public long getItemId(int position) 
    {
        return getItem(position).hashCode();
    }
    
    public void clear()
    {
        users.clear();
    }
    
    public void addAll(Collection<User> users)
    {
        this.users.addAll(users);
        notifyDataSetChanged();
    }
    
    public void replace(Collection<User> users)
    {
        clear();
        addAll(users);
    }
    
    public static PeopleUserAdapter init(Context context)
    {
        return new PeopleUserAdapter(context, R.layout.item_user);
    }
    

    }

    【讨论】:

      【解决方案3】:

      adapter.remove(item) .. 然后拨打adapter.notifyDataSetChanged();

      【讨论】:

        【解决方案4】:

        如果您使用的是自定义适配器(用于自定义布局列表视图),您需要这样做:

        当您的适配器类似于:

        public class YourAdapterName extends ArrayAdapter<yourObject>
        

        那么删除选中的 ListView 项的代码是:

        ListView yourListView = (ListView) findViewById(R.id.listviewid); 
        YourAdapterName adapter;
        adapter = (YourAdapterName) yourListView.getAdapter();
        yourObject theitem = adapter.getItem(position);
        adapter.remove(theitem);
        adapte.notifyDataSetChanged();
        

        这是假设您在一个事件中,该事件使您可以访问列表视图中的当前位置。喜欢:

        public boolean onItemLongClick(AdapterView<?> parent, View strings,int position, long id)
        

        public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
        

        否则您将需要通过其他方式获取该位置,例如将其(onItemClick 或 onItemLongClick)存储在带有 Visibility.GONE 的 textView 中,并在单击按钮时检索它(这很愚蠢,您可以使用各种存储选项,例如全局变量、数据库等)。

        【讨论】:

        • 这适用于 ArrayAdapter,但您不能将泛型与 BaseAdapter 一起使用。
        【解决方案5】:

        确保您已覆盖自定义适配器上的删除方法

        例如,如果这是您的添加方法:

        @Override
        public void add(String[] object) {
            scoreList.add(object);
            super.add(object);
        }
        

        那么您的删除方法将如下所示:

        @Override
        public void remove(String[] object) {
            scoreList.remove(object);
            super.remove(object);
        }
        

        【讨论】:

          【解决方案6】:

          调用以下两行::

          adapter.remove(inverterNo);
          adapter.notifyDataSetChanged();
          

          inverterNo 是你的项目

          【讨论】:

            【解决方案7】:

            很简单;您只需要:在您的个性化适配器中添加一个公共方法:

            public void remove(int position) {
                itemsMovieModelFiltered.remove(position);
                notifyDataSetChanged();
            }
            

            请记住,您必须在您的个性化适配器中添加此方法。 然后,从其他地方调用这个方法

             adapte=new PersonalizeListAdapter(getActivity().getApplicationContext(),
                        movieModelList);
            adapte.remove(position);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-22
              • 1970-01-01
              相关资源
              最近更新 更多