我正在尝试创建一个列表视图,每个列表项都不同,它们的布局是由代码创建的。初始布局看起来很好,但是当我向外滚动时,所有以编程方式添加的布局项目都会再次添加,从而产生重复的项目。我该如何解决这个问题?
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
MyHolder holder;
if (v == null) {
LayoutInflater li = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.empty_item, null);
holder = new MyHolder(v);
v.setTag(holder);
} else {
holder = (MyHolder) v.getTag();
}
TextView textView = new TextView(activity);
textView.setText(items.get(position).getItems().get(i).getText());
textView.setLayoutParams(params);
holder.linearLayout.addView(textView);
return v;
}
class MyHolder{
public TextView tvTitle;
public LinearLayout linearLayout;
public CardView cardView;
public MyHolder(View base){
tvTitle = (TextView)base.findViewById(R.id.tvTitle);
cardView = (CardView)base.findViewById(R.id.card_view2);
linearLayout = (LinearLayout)base.findViewById(R.id.linearLayoutCard);
}
}
答案 0 :(得分:1)
我甚至不确定此代码是如何运行的,因为您的getView()
方法中没有return语句。但是您需要在convertView
中返回getView()
,以便ListView
可以在需要时重复使用这些return v;
。否则,它会在每次需要时不断询问新视图。因此,您只需将getView()
放在MyHolder
的末尾。
此外,您正在为if (v == null)
块之外的convertView
对象创建和添加新的TextView。通常,如果convertView
为空,您将实例化此类新视图。如果不是,您只需将其传递给ListView或在传回之前对其进行更新。所以发生了什么,TextView
可用(非空),但不是使用它,而是添加一个全新的def odds_and_evens(string, return_odds)
new_string = string.chars.to_a
even_odd_string = []
new_string.each_with_index do |letter, index|
if return_odds != true && index %2 == 0
even_odd_string << letter
elsif return_odds != false && index %2 == 1
even_odd_string << letter
end
end
even_odd_string
end
puts odds_and_evens("abcdefgh", true)
,这就是你得到重复的原因。