2014-01-10 2 views
2

Когда я получаю результат поиска из таблицы, результаты отображаются дважды.ListView Duplicates Android

Duplicate Results

Результаты "A/A", "аа/аа" и "AB/а" все правильно и должны быть там. Однако я не хочу дублировать значения в третьей записи списка.

Любые идеи, почему это происходит?

Главный экран

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

CustomAdapter

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; 

    } 
} 

ответ

8

Ну, проблема в вашем методе 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; 

}

+0

работает прекрасно. Благодарю. – erad

+0

Как это может работать? нет 'convertView = row' или' convertView.setTag (row) '. – Siddharth

+0

Он работает, потому что строка «Вид» используется только как указатель - convertView и строка в конечном итоге ссылаются на один и тот же объект. Вы можете честно вывести View row = null, инструкцию else и заменить все переменные «row» на convertView, и он будет работать одинаково. Я опубликовал этот ответ некоторое время назад, и выше это то, как я решил сделать это в то время. Кроме того, в приведенном выше примере нет необходимости устанавливать тег в представлении. – Submersed

0

View повторно используется адаптером. Поэтому, когда вы звоните

linearMain.addView(label); 

Он добавляет несколько просмотров в ваш элемент списка каждый раз, когда получает представление.

Вам нужно создать новый TextView каждый раз и добавить его в свой элемент списка? Я бы изменил это, чтобы просто установить текст на один существующий TextView.

+0

вы можете принять взглянуть на мой код http://stackoverflow.com/q/40145549/6648201 – rookieDeveloper