【问题标题】:listview with favorite button带有收藏按钮的列表视图
【发布时间】:2015-12-01 15:39:03
【问题描述】:

在我的项目中,我有一个带有星形图像的 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;
    }

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    View回收的问题,基本上当你滚动的时候,又重新创建了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 模式,尽管您的问题与此无关。

    【讨论】:

    • 问题更新。我知道你的答案是正确的,但我找不到正确的位置。你能编辑我的代码吗?
    • 只有你知道你需要实现什么样的逻辑,这取决于用户的选择是否需要在应用启动之间持久化以及你希望持久化什么样的数据。我提供了一个简单的示例来说明您需要做什么,但我建议您自己花时间阅读这些机制,因为您没有在更新的代码中正确实现 ViewHolder。花时间详细学习ListView,值得投资,更重要的是,如果你想进一步发展,没有办法;)
    【解决方案2】:

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

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

    【讨论】:

    • 查看这个帖子,Listview using ViewHolder
    • 问题更新。我知道你的答案是正确的,但我找不到正确的位置。你能编辑我的代码吗?
    • 您是否尝试了解 View-Holder 模式或只是复制代码?
    • 是的。但我不知道如何使用它。我英语不好
    【解决方案3】:

    首先,每次调用 getView 时,当它们应该被重用时,您都会膨胀一个新视图。检查视图持有者模式 - Smooth Scrolling

    现在关于您的问题,您需要一个数组来保存每个位置的收藏状态值(与标题大小相同的数组),或者将列表模式设置为 CHOICE_MODE_MULTIPLE 并使用背景选择器更改收藏状态。

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2019-05-16
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2015-07-31
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多