listview与收藏夹按钮

时间:2015-12-01 15:39:04

标签: android android-listview

在我的项目中,我有一个带有星形图像的listView。如果用户触摸星标项添加到收藏夹。所有代码都是正确的但是当listview滚动星形图像变为不可能时。这是我的代码:

 private class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resource, int textViewResourceId,
                     String[] strings) {
        super(context, resource, textViewResourceId, strings);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.custom_list_item, parent, false);

        String my_string = title[position].toString();
        final TextView content_title = (TextView) row.findViewById(R.id.contentitle);
        final ImageView favicon = (ImageView) row.findViewById(R.id.favicon);
        content_title.setText(my_string);
        content_title.setTypeface(koodakfont);

        if (favicon.getTag().equals("fav")) {
            favicon.setImageResource(R.drawable.favicon);
            favicon.setTag("fav");
        }

        favicon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (favicon.getTag().equals("unfav")) {
                    favicon.setImageResource(R.drawable.favicon);
                    favicon.setTag("fav");
                } else {
                   favicon.setImageResource(R.drawable.unfavicon);
                    favicon.setTag("unfav");
                }
            }
        });

        return row;
    }

编辑:以下编辑对我来说也不起作用。

static class ViewHolder {
    ImageView favicon;
}


private class MyAdapter extends ArrayAdapter<String> {


    public MyAdapter(Context context, int resource, int textViewResourceId,
                     String[] strings) {
        super(context, resource, textViewResourceId, strings);
    }



    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.custom_list_item, parent, false);

        String my_string = title[position].toString();
        final TextView content_title = (TextView) row.findViewById(R.id.contentitle);
        final ViewHolder holder = new ViewHolder();
        holder.favicon = (ImageView) row.findViewById(R.id.favicon);
        content_title.setText(my_string);
        content_title.setTypeface(koodakfont);

        if (holder.favicon.getTag().equals("fav")) {
            holder.favicon.setImageResource(R.drawable.favicon);
            holder.favicon.setTag("fav");
        }

        holder.favicon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if (holder.favicon.getTag().equals("unfav")) {
                    holder.favicon.setImageResource(R.drawable.favicon);
                    holder.favicon.setTag("fav");
                } else {
                    holder.favicon.setImageResource(R.drawable.unfavicon);
                    holder.favicon.setTag("unfav");
                }


            }
        });

        return row;
    }

3 个答案:

答案 0 :(得分:3)

这是View回收的问题,基本上滚动时,会再次创建视图,因此星形图标的状态会丢失。您需要实现一个逻辑来检查您需要为每次调用getView设置图标所需的状态。一个很好的起点可能是使用ListView中项目的位置来检查创建View时是否需要将您喜爱的图标设置为已加星标或未加星标。 我建议你阅读this answer,它详细解释了这种机制。 以下是您可以做的简化示例:

private boolean[] favorites; // initialize this array on creation of your adapter with the same size as your listView

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    //the rest of your code 

    if(favorites[position]){
        holder.favicon.setImageResource(R.drawable.favicon);
    else{
        holder.favicon.setImageResource(R.drawable.unfavicon);
    }
    holder.favicon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (favorites[position]) {
                holder.favicon.setImageResource(R.drawable.unfavicon);
                favorites[position] = false;
            } else {
                holder.favicon.setImageResource(R.drawable.favicon);
                favorites[position] = true;
            }
        }
    });

我还建议您出于效率原因开始使用ViewHolder模式,尽管问题与此无关。

答案 1 :(得分:1)

此处您的问题是favicon滚动ListView时再次创建对象。其中tag未设置,因为您以编程方式设置它。

我的建议是使用View-Holder模式。

答案 2 :(得分:0)

首先,每次调用getView时,您都应该重新使用新视图。检查视图持有者模式 - Smooth Scrolling

现在关于你的问题,你需要一个数组来保存每个位置的favs状态值(一个与标题大小相同的数组)或者将列表模式设置为CHOICE_MODE_MULTIPLE并用backgoung选择器改变favion状态。 / p>