【问题标题】:Remove items from ListView with a custom adapter使用自定义适配器从 ListView 中删除项目
【发布时间】:2012-05-10 18:21:57
【问题描述】:

我有一个自定义的ListView 和适配器。我可以从我的自定义列表中设置的列表中删除一个项目,但我可以从ListView 中删除。当我尝试调用adapter.remove(position) 时,编辑器说“创建一个方法"remove(int position)""。我不知道当我在适配器中创建这个方法时应该做什么。代码:

填写我的列表视图:

lv = (ListView) findViewById(R.id.list);
        LayoutInflater mLInflater = getLayoutInflater();
        final ListViewAdapter adapter = new ListViewAdapter(
                getApplicationContext(), kimdenlist, konulist,
                mLInflater);
        lv.setAdapter(adapter);

ListViewAdapter:

public class ListViewAdapter extends BaseAdapter {
    static HashMap<Integer, Boolean> cartItems = new HashMap<Integer, Boolean>();
    Context mContext;
    ArrayList<String> kimdenlist; // to load images
    ArrayList<String> konulist; // for data
    LayoutInflater mLayoutInflater;

    public ListViewAdapter(Context context, ArrayList<String> kimdenlist, ArrayList<String> konulist,
            LayoutInflater layoutInflater) {
        mContext = context;
        this.kimdenlist = kimdenlist;
        this.konulist = konulist;
        mLayoutInflater = layoutInflater;
    }

    @Override
    public int getCount() 
    {

        return kimdenlist.size(); // images array length
    }

    @Override
    public Object getItem(int arg0) {

        return null;
    }

    @Override
    public long getItemId(int arg0) {

        return 0;
    }

    int count = 0;

    // customized Listview
    @Override
    public View getView(int position, View arg1, ViewGroup arg2) {

        View v;
        final int pos = position;
        v = mLayoutInflater.inflate(R.layout.listust, null);

        TextView kimden = (TextView) v.findViewById(R.id.textvKimden);
        kimden.setText(kimdenlist.get(position));
        TextView konu = (TextView) v.findViewById(R.id.textvKonu);
        konu.setText(konulist.get(position));
        CheckBox ch = (CheckBox) v.findViewById(R.id.chk);
        try {
            if (count != 0) {
                boolean b = cartItems.get(pos);
                if (b == false)
                    ch.setChecked(false);
                else
                    ch.setChecked(true);
            }
        } catch (NullPointerException e) {

        }


        ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                cartItems.put(pos, arg1);
                count++;

            }
        });
        return v;
    }

    public static HashMap<Integer, Boolean> getcartItems() {
        return cartItems;
    }

}

当我点击“delete_Button”时:我只能从列表中删除:

konulist.remove(konulist.get(position));;
kimdenlist.remove(kimdenlist.get(position));

【问题讨论】:

    标签: android android-listview customization adapter


    【解决方案1】:

    这是因为你的 listViewAdapter 没有 remove 方法!您扩展 BaseAdapter 并且它没有删除方法。你应该在 listviewAdapter 中创建 remove 方法,它看起来像

    public void remove(int position){
        konulist.remove(konulist.get(position));;
        kimdenlist.remove(kimdenlist.get(position));
    }
    

    您必须了解列表视图和适配器的工作原理。适配器保存列表视图的数据。将要创建列表行时调用适配器方法 getView。列表大小由适配器的 getCount() 等返回的值计算...

    【讨论】:

    • 我已经在这样做了。我的列表项已删除,但我的列表视图项未删除。例如;我单击位置 = 0,位置零对于 konulist 有“A11”,对于 kimdenlist 有“A1”。并且 position=1 对 konulist 有“B11”,对 kimdenlist 有“B1”。他们在 listview 上列出。当我删除 position=0 然后回到 listview--> position=0 仍然存在!但是(当我继续处理时)我点击 position=0 它显示 position=1 的数据。
    • @Merve 删除项目后致电notifyDataSetChanged()
    • 没有改变现状
    【解决方案2】:

    要从 ListView 但不在适配器类中删除项目:

    lv.removeViewAt(index);
    adapter.notifyDataSetChanged();
    

    其中“index”指定 ListView 中包含要删除的项目的位置或索引。

    要从 ListView INSIDE ADAPTER CLASS 中删除一个项目:首先,您需要为列表中的每个项目添加一个标签。在列表中的内容项中使用一些布局来分配该标签。这可以在 getView() 方法中完成。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        row = convertView;
    
        if(row == null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.item_lista_lugares_visitar, parent, false);
            holder = new ViewHolder();
    
            // ... DO WHAT YOU NEED HERE
            holder.linearLayoutContainer = (LinearLayout) row.findViewById(R.id.ll_container);
            // Set the position as a Tag for the view
            holder.linearLayoutContainer.setTag(position);
    
        } else {
            holder = (ViewHolder) row.getTag();
        }
    
        // ... DO WHAT YOU NEED HERE
    
        return row;
    }
    
    // Method for remove an item of ListView inside adapter class
    // you need to pass as an argument the tag you added to the layout of your choice
    public void removeView(Object position) {
          // lv and the adapter must be public-static in their Activity Class
          SomeActivity.lv.removeViewAt(Integer.parteInt(position).toString());
          SomeActivity.adapter.notifyDataSetChanged();
    }
    

    【讨论】:

      【解决方案3】:

      在你的代码之后

      konulist.remove(konulist.get(position)); kimdenlist.remove(kimdenlist.get(position));

      你可以调用方法:

      notifyDataSetChanged();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多