自定义的ListView项目重复 [英] Custom ListView Items repeated
问题描述
我尝试添加动态的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屋!