如何在android listview中滚动时修复重复的项目?

如何在android listview中滚动时修复重复的项目?

问题描述:

我有一个自定义的适配器类,由ArrayAdapter扩展。我在我的活动中将适配器设置为listview。在我的objects列表中,我有8个对象。在listview显示5个对象时(当我滚动listview它有3个数据显示)。在滚动listview后,最后3个对象与第3个对象显示相同。这是我尝试的代码。如何在android listview中滚动时修复重复的项目?

适配器

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     final MenuItem listItem = objects.get(position); 
     holder = new Holder(); 
     LayoutInflater inflater = (LayoutInflater) this.context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.menu_list_item, parent); 

     holder.textViewItemName = (TextView) convertView.findViewById(R.id.textViewItemName); 
     holder.textViewItemName.setText(listItem.getItemName()); 

     holder.textViewPrice = (TextView) convertView.findViewById(R.id.textViewPrice); 
     holder.textViewPrice.setText("$ ".concat(String.valueOf(listItem.getItemPrice()))); 

     holder.imageView = (ImageView) convertView.findViewById(R.id.imageViewItem); 


     holder.buttonPlus = (ButtonRectangle) convertView.findViewById(R.id.buttonPlus); 
     holder.cartQtyTextView = (TextView) convertView.findViewById(R.id.textViewCartQty); 

     // Check & Set 
     if (holder.buttonPlus != null) { 
      holder.buttonPlus.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int i = 0; 
        if (holder.cartQtyTextView != null) { 
         holder.cartQtyTextView.setText("" + ++i); 
        } 
       } 
      }); 
     } 
     holder.buttonPlus.setBackgroundColor(Color.WHITE); 
     holder.buttonPlus.setTextColor(Color.parseColor("#333333")); 

     holder.buttonMinus = (ButtonRectangle) convertView.findViewById(R.id.buttonMinus); 

     // Check & Set 
     if (holder.buttonMinus != null) { 
      holder.buttonMinus.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int i = 0; 
        if (holder.cartQtyTextView != null) { 
         holder.cartQtyTextView.setText("" + --i); 
        } 
       } 
      }); 
     } 
     holder.buttonMinus.setBackgroundColor(Color.WHITE); 
     holder.buttonMinus.setTextColor(Color.parseColor("#333333")); 
     convertView.setTag(holder); 
    } else { 
     holder = (Holder) convertView.getTag(); 
    } 

    return convertView; 
} 

活动

listViweMenu.destroyDrawingCache(); 
listViweMenu.setVisibility(ListView.INVISIBLE); 
listViweMenu.setVisibility(ListView.VISIBLE); 
menuListAdapter.notifyDataSetChanged(); 
List<uk.co.bapos.android.baposwaiter.data.models.menu.MenuItem> itemsList 
      = MenuItemController.fetchAllCategoryItems(this, String.valueOf(new ArrayList<>(menuItemData.entrySet()).get(position).getValue())); 
listDataMenu.clear(); 
listDataMenu.addAll(itemsList); 

我如何可以解决这个问题?

+0

你可以显示你的数据数组吗? –

您正在调用getTag(),setTag()并将数据设置在错误的位置。试试这个:

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

      holder = new Holder(); 
      LayoutInflater inflater = (LayoutInflater) this.context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.menu_list_item, parent); 

      holder.textViewItemName = (TextView) convertView.findViewById(R.id.textViewItemName); 
      holder.textViewPrice = (TextView) convertView.findViewById(R.id.textViewPrice); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.imageViewItem); 
      holder.buttonPlus = (ButtonRectangle) convertView.findViewById(R.id.buttonPlus); 
      holder.cartQtyTextView = (TextView) convertView.findViewById(R.id.textViewCartQty); 
      holder.buttonMinus = (ButtonRectangle) convertView.findViewById(R.id.buttonMinus); 
      convertView.setTag(holder); 
     } else { 
      holder = (Holder) convertView.getTag(); 
     } 
      final MenuItem listItem = objects.get(position); 
      holder.textViewItemName.setText(listItem.getItemName()); 
      holder.textViewPrice.setText("$ ".concat(String.valueOf(listItem.getItemPrice()))); 
      // Check & Set 
      if (holder.buttonPlus != null) { 
       holder.buttonPlus.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         int i = 0; 
         if (holder.cartQtyTextView != null) { 
          holder.cartQtyTextView.setText("" + ++i); 
         } 
        } 
       }); 
      } 
      holder.buttonPlus.setBackgroundColor(Color.WHITE); 
      holder.buttonPlus.setTextColor(Color.parseColor("#333333")); 

      // Check & Set 
      if (holder.buttonMinus != null) { 
       holder.buttonMinus.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         int i = 0; 
         if (holder.cartQtyTextView != null) { 
          holder.cartQtyTextView.setText("" + --i); 
         } 
        } 
       }); 
      } 
      holder.buttonMinus.setBackgroundColor(Color.WHITE); 
      holder.buttonMinus.setTextColor(Color.parseColor("#333333")); 

     } 
     return convertView; 
    } 

获得的视图的所有的ID后,使用setTag(),如果视图不为空使用getTag()来获得所有的ID后面。只有在将数据设置为视图之后。

在活动时间:

ArrayAdapter adapter = myAdapter();//pass arraylist or data to adapter here 
listview.setAdapter(adapter); 
+0

谢谢..它的工作原理。 :) – codebot

您需要了解为什么使用支架,并设置为标签。

如果convertView不是null意味着你会被重用的观点(这可以提高性能和节省内存) 现在你在做什么,当它不为空是 架=(持有人)convertView.getTag(); 并返回sameConvertView所以你得到了同样的看法

你需要得到持有人的标签后,做的是改变使用支架 如holder.textViewItemName.setText(listItem.getItemName())的视图信息; //需要得到基于位置的当前列表项目。

@Override public View getView(int position, View convertView, ViewGroup parent) 
{ 
if (convertView == null) 
    { 
    final MenuItem listItem = objects.get(position); 
    holder = new Holder(); LayoutInflater inflater = (LayoutInflater) this.context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.menu_list_item, parent); 
    holder.textViewItemName = (TextView)convertView.findViewById(R.id.textViewItemName); 
    holder.textViewPrice = (TextView) convertView.findViewById(R.id.textViewPrice); 
    holder.imageView = (ImageView) convertView.findViewById(R.id.imageViewItem); 
    holder.buttonPlus = (ButtonRectangle) convertView.findViewById(R.id.buttonPlus); 
    holder.cartQtyTextView = (TextView) convertView.findViewById(R.id.textViewCartQty); 
    holder.buttonMinus = (ButtonRectangle) convertView.findViewById(R.id.buttonMinus); 

    convertView.setTag(holder); } 
    else 
    { 
    holder = (Holder) convertView.getTag(); 
    } 
    holder.textViewItemName.setText(listItem.getItemName()); 
    holder.textViewPrice.setText("$ ".concat(String.valueOf(listItem.getItemPrice()))); // Check & Set if (holder.buttonPlus != null) { 
    holder.buttonPlus.setOnClickListener(new View.OnClickListener() 
    { 

    @Override public void onClick(View v) 
{ 
int i = 0; if (holder.cartQtyTextView != null) 
{ 
holder.cartQtyTextView.setText("" + ++i); 
} 
} 
    }); 
} 

holder.buttonPlus.setBackgroundColor(Color.WHITE); 
holder.buttonPlus.setTextColor(Color.parseColor("#333333")); 

// Check & Set if (holder.buttonMinus != null) 
{ 
holder.buttonMinus.setOnClickListener(new View.OnClickListener() 
{ 
@Override public void onClick(View v) 
{ 
    int i = 0; if (holder.cartQtyTextView != null) 
{ 
    holder.cartQtyTextView.setText("" + --i); 
    } 
} }); } 
    holder.buttonMinus.setBackgroundColor(Color.WHITE);  
    holder.buttonMinus.setTextColor(Color.parseColor("#333333")); 
    return convertView; 
} 

试试这个。

LayoutInflater inflater = (LayoutInflater) this.context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
if (convertView == null) { 
convertView = inflater.inflate(R.layout.menu_list_item, parent); 
//initializing your view elements 
convertView.setTag(holder); 
} 
else{ 
holder = (Holder) convertView.getTag(); 
} 
// do other stuff after if-else, setting the values to view elements