2013-05-13 1 views
1

ListView 및 ListAdapter 재활용 프로세스에 대한 웹에서 수천 개의 게시물이있을 수 있지만 지금까지는 문제를 해결할 수 없었습니다.안드로이드 ListView "recycle"은 처음에는 보이지 않는 행을 저장하지 않습니다.

사용자 지정 ListView 행이 있고 행 (TextViews, ImageViews 등)의 항목을 원격 서버에서 가져온 데이터로 채 웁니다. 한 번에 최대 5 개의 행을 표시 할 수 있으며 행이 더 있으면 스크롤해야합니다. 문제는; 어댑터는 처음 5 행의 정보만을 저장하고 재활용하며 6 행, 7 행, 8 행 등을 볼 수 있도록 스크롤하더라도 임의의 위치에서 동일한 5 행을 반복적으로 볼 수 있습니다. 여기

코드입니다 :

public class ListAdapter extends BaseAdapter { 

    private ArrayList<String> id, name, address; 
    private Context context; 

    public ListAdapter(Context c, ArrayList<String> id, 
      ArrayList<String> name, ArrayList<String> address,) { 
     this.id = id; 
     this.name = name; 
     this.address = address; 
     this.context = c; 
    } 

    @Override 
    public int getCount() { 
     return id.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return id.get(position); 
    } 

    @Override 
    public long getItemId(int id) { 
     return id; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View rowsLayout; 

     if (convertView == null) { 
      rowsLayout = (View)LayoutInflater.from(context) 
          .inflate(R.layout.list_item, null); 
      //Assign values to TextViews in here 
     } else { 
      rowsLayout = convertView; 
     } 
      return rowsLayout; 
    } 
} 

내가 this website의 방법을 사용하여 시도했지만 도움이되지 않았다.

아무도 나에게 솔루션을 제공 할 수 있다면 (코드를 사용하여) 또는 다른 게시물로 이동하면 감사하게 될 것입니다.

+0

http://stackoverflow.com/questions/16515077/widget-in-listview-disappears-when-listview-scrolls-down/16515327#16515327 –

답변

0
이에서 코드를 변경

:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View rowsLayout; 

    if (convertView == null) { 
     rowsLayout = (View)LayoutInflater.from(context) 
         .inflate(R.layout.servisler_list_item, null); 
     //Assign values to TextViews in here 
    } else { 
     rowsLayout = convertView; 
    } 
     return servisRowsLayout; 
} 

이에 :

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View rowsLayout; 

    if (convertView == null) { 
     rowsLayout = (View)LayoutInflater.from(context) 
         .inflate(R.layout.servisler_list_item, null); 
    } else { 
     rowsLayout = convertView; 
    } 

     //Assign values to TextViews in here 

     return servisRowsLayout; 
} 

당신은 에있는 모든getView() 전화를 "TextViews에 값을 할당"필요, 그들 중 단지 몇 가지.

+0

내 원래 게시물에서 언급 했어야합니다; 행에 너무 많은 항목 (이미지 포함)이 있기 때문에 스크롤을 느리게 처리하기 때문에이 작업을 수행 할 수 없습니다. 주어진 시간에 15-16 행 이상을 가지지 않기 때문에 재활용을 비활성화하고 행을 영구적으로 유지하는 방법을 찾고 있습니다. –

+0

@EnginYapici : 행에 너무 많은 항목 (이미지 포함)이 있고 스크롤이 너무 느려서이 작업을 수행 할 수 없습니다. 그런 다음 디스크/이미지에서 이미지를로드하는 것과 같이 기본 응용 프로그램 스레드에서 잘못된 작업을 수행하고 있습니다. 회로망. "주어진 시간에 15-16 행 이상을 가지지 않기 때문에 재활용을 비활성화하고 행을 영구적으로 유지하는 방법을 찾고 있습니다."- getViewTypeCount()를 재정 의하여 getCount()를 반환하고 반환합니다. 'getItemViewType()'은'position'을 반환하므로 Android는 각 행이 고유하다고 생각합니다. 이것을 시도하지 않았지만 효과가 있습니다. – CommonsWare

+0

@EnginYapici : 내가 설명한 해킹은 처음에는 성능 문제를 해결하는 것보다 훨씬 더 나쁜 아이디어입니다. – CommonsWare