ListView回收

时间:2014-07-21 17:37:23

标签: android listview android-listview

我很难理解我的具体情况应该如何处理有关回收的观点。

我有一个朋友及其名字的列表。

如果他们在线,他们的名字是绿色的。

如果他们离线,他们的名字是灰色的,他们的照片是半透明的。

如果在我的适配器中我使用:

public int getViewTypeCount() {                 
    return 1;
}

然后视图被回收,当我滚动某个绿色名称的人离开视图然后返回时,他们的名字变成灰色,他们的照片变得半透明。

用户的在线或离线状态是基于对数据库的查询,所以我不明白我应该如何使用正确的信息重置该视图再次回到屏幕上。

之前,我有这个:

public int getViewTypeCount() {                 

    return getCount();
}

并且我没有查看回收问题,但当用户的列表中有0个朋友时,应用程序崩溃了。

非常感谢任何帮助!

getView:

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        final ViewHolder holder;
        if (convertView == null){

            convertView = inflater.inflate(R.layout.list_item, null);

            holder = new ViewHolder();
            holder.fbphoto = (ImageView)convertView.findViewById(R.id.fbphoto);
            holder.name = (TextView)convertView.findViewById(R.id.name);


            convertView.setTag(holder);

        } else {

            holder = (ViewHolder)convertView.getTag();
        }



        final HashMap<String,String> item = (HashMap<String,String> ) items.get(position);
        if (item != null)
        {

            String facebookProfilePicUrl = "https://graph.facebook.com/"+item.get(TAG_FACEBOOKID)+"/picture?width=150&height=150";

            Picasso.with(mContext)
            .load(facebookProfilePicUrl)
            .placeholder(R.drawable.no_image)
            .into(holder.fbphoto);

            if ( item.get(TAG_USERNAME).length() > 23 ) {

                holder.name.setText(item.get(TAG_USERNAME).substring(0, Math.min(item.get(TAG_USERNAME).length(), 20)) + "..."); 

                } else {

                    holder.name.setText(item.get(TAG_USERNAME));
                }


            if ("2".equals(item.get(TAG_THEM_ONLINE))) {
                //nothing, will add more later
                } else {
                    holder.name.setTextColor(Color.parseColor("#a7a7a7"));
                    holder.fbphoto.setAlpha(.4f);
                    }


        }

        return convertView;
    }

编辑:嗯,我觉得很傻。我在用户离线时动态设置名称颜色等,但仅为xml中的在线用户设置颜色等。因此,当屏幕重新加载视图时,它不知道如何正确设置它们。

1 个答案:

答案 0 :(得分:0)

好的,你有两种状态,离线和在线,有不同的颜色等。

你需要为getViewTypeCount(离线和在线)返回2

进一步你需要实现getViewType,如果项目在线或离线,你需要返回0或1。

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return getItem(position).isOnline ? 1 : 0;
}

例如。

哦,之前你没有遇到任何问题,因为你退回了Typecount ==物品的大小。每个项目都有不同的类型,所以你永远不会得到任何回收的视图。

请参阅我的第一个回答:java.lang.IllegalArgumentException: Can't have a viewTypeCount < 1