自定义的ListView项目重复 [英] Custom ListView Items repeated

查看:156
本文介绍了自定义的ListView项目重复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试添加动态的TextView到ListView的items.textviews可以是1-2或更重要的是取决于数据我在加入TextView的成功,但问题是重复上滚动textviews。

我在loop.I创建的TextView的每一次新的对象,我意识到,android的尝试重用现有视图的问题,但我必须每次添加新的视图。

下面是我的code在自定义适配器:

 公共类ViewHolder {
    TextView的文本1;
    LinearLayout中的LinearLayout;
    的TextView吨;
    TextView的T1;
}

getView方法

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){    ViewHolder持有人;    如果(convertView == NULL){
        convertView = mInflater.inflate(R.layout.two_item_icon_text,NULL);
        持有人=新ViewHolder();
        holder.text1 =(TextView中)convertView.findViewById(R.id.text1);        convertView.setTag(保持器);
    }其他{        支架=(ViewHolder)convertView.getTag();    }    holder.linearLayout =(的LinearLayout)convertView.findViewById(R.id.lin_lay_dynamic);
    holder.text1.setText(+ DATA1 [位置]);
    串TMP,dateparsed;
    dateparsed = DATA1 [位置] .substring(0,DATA1 [位置] .indexOf(:));
    为(中间体X = 0; X&下; calendareventholder1.size(); X ++){        objHolder =(CalendarEventHolder)calendareventholder1.get(X);        如果(objHolder.opendate.equals(displaydate [电流])){            。TMP = objHolder.dtstarttime.toString()子串(0,objHolder.dtstarttime.toString()的indexOf(:));            如果(的Integer.parseInt(TMP)GT =的Integer.parseInt(dateparsed)及&放大器;的Integer.parseInt(TMP)下;的Integer.parseInt(dateparsed)+1){
                holder.t =新的TextView(convertView.getContext());
                holder.t.setText(: - D);
                holder.t.setOnClickListener(本);                如果(Common.isChildSessionAlerted(将String.valueOf(objHolder.id),getApplicationContext(),object1)){                    holder.t.setText(holder.t.getText()+ objHolder.dtstarttime ++ objHolder.dtendtime +:-a);
                }其他{
                    holder.t.setText(holder.t.getText()+ objHolder.dtstarttime ++ objHolder.dtendtime);
                }
                holder.t.setTag(objHolder.id);
                holder.t.setTextSize(Common.get preferenceInt(getApplicationContext(),普通preF_FONT_SIZE,10));
                holder.t.setTextColor(Color.BLACK);
                holder.t.setText(getSmiledText(ScheduleActivity.this,
                。holder.t.getText()的toString()));
                holder.linearLayout.addView(holder.t);
                holder.t1 =新的TextView(convertView.getContext());
                holder.t1.setOnClickListener(本);
                holder.t1.setText(objHolder.title);
                holder.t1.setTag(objHolder.id);                holder.t1.setTextSize(Common.get preferenceInt(getApplicationContext(),普通preF_FONT_SIZE,10));
                holder.t1.setTextColor(Color.BLACK);
                holder.linearLayout.addView(holder.t1);
            }
        }
    }
    返回convertView;
}


解决方案

它是一个有点难以真正理解什么是持有人,因为它是不是超级描述性的,但如果我是正确的阅读您的问题,原因你得到重复的项目是因为你刚刚加入查看,从来没有删除的内容在那里了。 的ListView 回收的意见,这意味着什么有previously在那里停留。因为它滚动,它实际上一直重用的意见,而不是创造新的。我不细讲,因为有一堆问题就在这里,有类似问题。但在顶部,你应该做的。

  getView(){
    / * previous东西,holder.linearLayout必须设置!* /
    如果(holder.linearLayout.getChildCount()大于0)
        holder.linearLayout.removeAllViews();

这样的观点已经在那里将被删除。最后一件事,你也应该看看这个。在理解为什么你必须做什么,我贴有极大的帮助。

I am trying to add dynamic textview to listview items.textviews can be of 1-2 or more than that depending on data I have succeed in adding the textview but problem is textviews are repeated on scroll.

I am creating new object of textview each time in loop.I am aware of the problem that android tries to reuse existing view but i have to add new view every time.

Here is my code in custom adapter:

public class ViewHolder {
    TextView text1;
    LinearLayout linearLayout;
    TextView t;
    TextView t1;
}

getView method

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.two_item_icon_text, null);
        holder = new ViewHolder();
        holder.text1 = (TextView) convertView.findViewById(R.id.text1);

        convertView.setTag(holder);
    } else {

        holder = (ViewHolder) convertView.getTag();

    }

    holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.lin_lay_dynamic);
    holder.text1.setText("" + DATA1[position]);
    String tmp, dateparsed;
    dateparsed = DATA1[position].substring(0, DATA1[position].indexOf(":"));
    for (int x = 0; x < calendareventholder1.size(); x++) {

        objHolder = (CalendarEventHolder) calendareventholder1.get(x);

        if (objHolder.opendate.equals(displaydate[current])) {

            tmp = objHolder.dtstarttime.toString().substring(0, objHolder.dtstarttime.toString().indexOf(":"));

            if (Integer.parseInt(tmp) >= Integer.parseInt(dateparsed) && Integer.parseInt(tmp) < Integer.parseInt(dateparsed) + 1) {
                holder.t = new TextView(convertView.getContext());
                holder.t.setText(":-d ");
                holder.t.setOnClickListener(this);

                if (Common.isChildSessionAlerted(String.valueOf(objHolder.id), getApplicationContext(), object1)) {

                    holder.t.setText(holder.t.getText() + objHolder.dtstarttime + " " + objHolder.dtendtime + " :-a");
                } else {
                    holder.t.setText(holder.t.getText() + objHolder.dtstarttime + " " + objHolder.dtendtime);
                }
                holder.t.setTag(objHolder.id);
                holder.t.setTextSize(Common.getPreferenceInt(getApplicationContext(), Common.PREF_FONT_SIZE, 10));
                holder.t.setTextColor(Color.BLACK);
                holder.t.setText(getSmiledText(ScheduleActivity.this,
                holder.t.getText().toString()));
                holder.linearLayout.addView(holder.t);
                holder.t1 = new TextView(convertView.getContext());
                holder.t1.setOnClickListener(this);
                holder.t1.setText(objHolder.title);
                holder.t1.setTag(objHolder.id);

                holder.t1.setTextSize(Common.getPreferenceInt(getApplicationContext(), Common.PREF_FONT_SIZE, 10));
                holder.t1.setTextColor(Color.BLACK);
                holder.linearLayout.addView(holder.t1);
            }
        }
    }
    return convertView;
}

解决方案

Its a little hard to really understand what is in holder since it isn't super descriptive, but if I am reading your question right, the reason you are getting repeated items is because you are just adding Views and never deleting what was there before. ListView recycles views, meaning what was there previously stays there. As it scrolls it actually keeps reusing views rather than creating new ones. I won't go into detail because there are a bunch of question on here with similar problems. But at the top you should do

getView() {
    /*previous stuff, and holder.linearLayout must have been set!*/
    if(holder.linearLayout.getChildCount() > 0)
        holder.linearLayout.removeAllViews();

This way any views already there will be removed. One last thing, you should also check out this. Immensely helpful in understanding why you have to do what I posted.

这篇关于自定义的ListView项目重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆