【问题标题】:ListView Duplicates AndroidListView 重复 Android
【发布时间】:2014-01-10 20:39:11
【问题描述】:

当我从表中获得搜索结果时,结果会显示两次。

结果“a / a”、“aa / aa”和“ab / a”都是正确的,应该在那里。但是,我不希望第三个列表视图条目中出现重复值。

任何想法为什么会发生这种情况?

主屏幕

// Set up search array
    for(int i = 0; i < isbn.length; i++)
    {
        searchArray.add(new InventoryItem(isbn[i], InventoryAdapter.getTitleAndAuthorByISBN(isbn[i])));
    }
    Toast.makeText(getApplicationContext(), "searchArray.size()="+searchArray.size(), Toast.LENGTH_LONG).show();

    // add data in custom adapter
    adapter = new CustomAdapter(this, R.layout.list, searchArray);
    ListView dataList = (ListView) findViewById(R.id.list);
    dataList.setAdapter(adapter);

自定义适配器

public class CustomAdapter extends ArrayAdapter<InventoryItem> {
   Context context;
   int layoutResourceId;
   LinearLayout linearMain;
   ArrayList<InventoryItem> data = new ArrayList<InventoryItem>();

   public CustomAdapter(Context context, int layoutResourceId,
                 ArrayList<InventoryItem> data) {
          super(context, layoutResourceId, data);
          this.layoutResourceId = layoutResourceId;
          this.context = context;
          this.data = data;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;

          if (row == null) {
                 LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                 row = inflater.inflate(layoutResourceId, parent, false);
                 linearMain = (LinearLayout) row.findViewById(R.id.lineraMain);
                 }

                 InventoryItem myItem = data.get(position);
                 TextView label = new TextView(context);
                 label.setText(myItem.details);
                 linearMain.addView(label);

          return row;

   }
}

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    嗯,问题出在您的getView(int position, View convertView, ViewGroup parent) 方法中,因为您不断将视图添加到 listview 为您提供的先前回收的视图中。与其动态创建文本视图,不如在创建视图时对其进行膨胀。

    例如,要解决这个问题:

        @Override
           public View getView(int position, View convertView, ViewGroup parent) {
               View row = null;
    
              if (convertView == null) {
                     LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                     row = inflater.inflate(layoutResourceId, parent, false);
                     //Make sure the textview exists in this xml
              } else {
                     row = convertView;
              }
    
              InventoryItem myItem = data.get(position);
              TextView label = (Textview) row.findViewById(R.id.YOU_TEXT_VIEW_ID);
              label.setText(myItem.details);
    
              return row;
    
       }
    

    【讨论】:

    • 效果很好。谢谢。
    • 这如何工作?没有convertView = rowconvertView.setTag(row)
    • 之所以有效,是因为 View 行仅用作指针 - convertView 和 row 最终都引用同一个对象。老实说,您可以取出 View row = null,else 语句,并用 convertView 替换所有“行”变量,它的工作原理是一样的。我不久前发布了这个答案,以上就是我当时决定这样做的方式。此外,在上面的示例中,不需要在视图上设置标签。
    【解决方案2】:

    视图被适配器重用。所以当你打电话时

    linearMain.addView(label);
    

    每次获取视图时,它都会将多个视图添加到您的列表项中。

    您真的需要每次都创建一个新的TextView 并将其添加到您的列表项中吗?我会将其更改为仅将文本设置在一个现有的 TextView 上。

    【讨论】:

    猜你喜欢
    • 2014-01-05
    • 2018-02-26
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2011-11-29
    • 2019-02-05
    相关资源
    最近更新 更多