2014-01-10 4 views
2

테이블에서 검색 결과를 얻으면 결과가 두 번 표시됩니다.ListView 중복 Android

Duplicate Results

결과의 "/ A", "AA/AA"및 "AB가 /"모두 정확하고있을 것이다. 그러나, 나는 세 번째 listview 항목에 중복 값을 원하지 않습니다.

왜 이런 생각입니까?

메인 화면

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

View 행이 포인터로 사용되기 때문에 작동합니다. convertView와 행이 모두 같은 Object를 참조하게됩니다. 당신은 모든 정직에서 View row = null, else 문을 취할 수 있으며 모든 "row"변수를 convertView로 바꾸면 동일하게 작동합니다. 나는이 답변을 얼마 전 게시했는데 위의 내용은 당시 내가 결정한 것입니다. 또한 위의 예제에서는 뷰에 태그를 설정할 필요가 없습니다. – Submersed

0

보기는 어댑터에 의해 다시 사용됩니다. 전화 할 때

linearMain.addView(label); 

보기를 가져올 때마다 목록 항목에 여러 개의보기가 추가됩니다.

매번 새로운 TextView을 작성하여 목록 항목에 추가해야합니까? 이것을 기존의 하나의 텍스트로 설정하기 위해 이것을 바꿀 것입니다. TextView.

+0

당신이 아름다운 작품 내 코드 http://stackoverflow.com/q/40145549/6648201 – rookieDeveloper