多次添加到列表项的项目。我该如何解决?

时间:2015-12-15 15:18:47

标签: android

我正在尝试创建一个列表视图,每个列表项都不同,它们的布局是由代码创建的。初始布局看起来很好,但是当我向外滚动时,所有以编程方式添加的布局项目都会再次添加,从而产生重复的项目。我该如何解决这个问题?

@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);



        }
    }

1 个答案:

答案 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) ,这就是你得到重复的原因。