从适配器中删除列表中的行

时间:2013-05-28 13:35:38

标签: android listview row

我正在尝试实施一个"最喜欢的项目"我的列表视图中的功能。 当用户触摸"最喜欢的"任何行的imageview,如果项目不是最喜欢的,它就会成为最爱,如果项目是最喜欢的,它就会成为非常喜欢的,并且该行会从视图中消失。 (在我的应用程序中有一个单独的视图,用户可以将喜好设置为true,如果他愿意的话)

对于每个列表项,我使用Sharedpreferences来存储它是否是最喜欢的。

我在listadapter中处理clicklistener,而不是在我的列表活动中。

我的ListAdapter代码:

public class ListItemsAdapter extends ArrayAdapter<ListItems> {

int resource;
String response;
Context context;

//Initialize adapter
public ListItemsAdapter(Context context, int resource, List<ListItems> items) {
    super(context, resource, items);
    this.resource=resource; 
}     

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    LinearLayout ll;
    //Get the current alert object
    final ListItems i = getItem(position);

    //Inflate the view
    if(convertView==null)
    {
        ll = new LinearLayout(getContext());
        String inflater = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater li;
        li = (LayoutInflater)getContext().getSystemService(inflater);
        li.inflate(resource, ll, true);
    }
    else
    {
        ll = (LinearLayout) convertView;
    }

// to display favorite icon on each row
    ImageView favo = (ImageView)ll.findViewById(R.id.favView);
    SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(getContext()); 
    if (sPrefs.getBoolean("fav"+i.id, false)==false) 
        favo.setBackgroundResource(R.drawable.icon_favoriteno);
    if (sPrefs.getBoolean("fav"+i.id, false)==true) 
        favo.setBackgroundResource(R.drawable.icon_favoriteyes);

// listener of the imageview to handle the user's touch
    final ImageView fav = (ImageView)ll.findViewById(R.id.favView);        
    fav.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {               
            SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());     
            if (sPrefs.getBoolean("fav"+i.id, false)==false) {
                Toast.makeText(getContext(), R.string.addedToFavorite, Toast.LENGTH_SHORT).show();
                fav.setBackgroundResource(R.drawable.icon_favoriteyes);
                SharedPreferences.Editor editor = sPrefs.edit();
                editor.putBoolean("fav"+i.id, true);
                editor.commit();

                }

            else if (sPrefs.getBoolean("fav"+i.id, false)==true) {
                Toast.makeText(getContext(), R.string.removedFromFavorite, Toast.LENGTH_SHORT).show();
                fav.setBackgroundResource(R.drawable.icon_favoriteno);

                SharedPreferences.Editor editor = sPrefs.edit();
                editor.putBoolean("fav"+i.id, false);
                editor.commit();

                }
            }
        });


    return ll;
}

图标的显示是否设置为收藏或不合作。我没有设法做的是,一旦用户将收藏夹图标设置为no,该行就会消失。

我试图添加notifyDataSetChanged();在onclicklistener但它什么也没做。 有可能我没有得到我想要的东西,因为我试图在我的ListAdapter类中而不是我的Activity类中执行此操作。 问题是每行有几个图标,每个图标都有一个onclicklistener,所以我想我不能使用活动类来处理点击,但也许我错了

2 个答案:

答案 0 :(得分:2)

您是否真的将其从适配器的数据集中删除? 因为我无法在OnClickListener的代码中看到对{Array}运算符的remove调用。

适配器本身只关心它的数据集 - 而不是你如何绘制视图(这是你用你的收藏夹做的。

答案 1 :(得分:0)

根据您的问题,只是从列表视图中删除一行,

在ListItemsAdapter的构造函数中分配ListItem时,

您只需要从ListItems中删除该项,并将适配器重新分配给listview或为适配器调用notifyDataSetChanged,代码如下,

items.remove(location);
adapter = new ListItemsAdapter(this,1, items);//not sure about integer parameter so I just put 1
list.setAdapter(adapter); 

items.remove(location);
adapter.notifyDataSetChanged();

以上两个选项中的任何一个都应该有效。