2013-06-11 6 views
0

나는 100 개의 항목으로 구성된 listview를 가지고있다. 모든 항목에는 LinearLayouts 몇 개가 있지만 그 중 하나는 Visibility.GONE입니다. 모든 항목에는 텍스트보기와 이미지가 있습니다. 이미지 클릭 Visibility.GIS to View.VISIBLE로 LinearLayout을 설정하고 싶습니다. 목록보기를 아래로 스크롤 할 때까지 제대로 작동하지만 4 번째 항목마다 VISIBLE로 설정된 동일한 레이아웃이 있지만 클릭 한 번만 있으면됩니다! 여기의 getView 방법입니다 : 당신의 의견을 재활용되기 때문이다안드로이드 : 잘못된 행 레이아웃 가시성을 변경하는 ListView

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ImageView imgForClick; 
    View vi = convertView; 
    if (convertView == null) 
     vi = inflater.inflate(R.layout.custom_row, null); 
    final LinearLayout hiddenLayout = (LinearLayout)vi.findViewById(R.id.hiddenLayout); 

    imgForClick = (ImageView)vi.findViewById(R.id.imageView3); 
    imgForClick.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      hiddenLayout.setVisibility(View.VISIBLE); 
     } 
    }); 
    return vi; 
} 

답변

2

때문에 레이아웃은 클릭에서 변경됩니다 후 해당 레이아웃 메모리를 절약하기 위해 다른 행에 사용됩니다.

public View getView(final int position, View convertView, ViewGroup parent) { 
... 
if (shouldBeVisible.get(position)) { 
    hiddenLayout.setVisibility(View.VISIBLE); 
} else { 
    hiddenLayout.setVisibility(View.GONE); 
} 

그런 식으로 레이아웃이 항상있을 것입니다 :

당신은 레이아웃이 표시되어야하는지 여부를 알기 위해 각 행의 상태를 기억하거나하지

이런 식으로 뭔가가 필요 편도 또는 다른 설정하십시오.

shouldBeVisible은 레이아웃이 표시되어야하는 행을 알 수있는 무언가 인 List입니다.

EDIT_ 대안은보기 재활용을 제거하는 것이지만 성능이 크게 저하 될 수 있으므로 수행하지 말아야하지만 모든 옵션을 나열하는 것으로 설명하고 있습니다.

당신은 안드로이드 항상 새로운보기를 부풀게 만드는 대신 가능하면 재활용 하나를 사용하여 라인 if (convertView == null)

을 제거하는 것입니다.

+0

감사합니다. 목록이있는 첫 번째 사람은 훌륭했습니다. – user2475805

+0

이것을 읽은 것은 내가보기의 재발견을 생각 나게하는 데 필요한 것입니다. 왜 다른 목록 항목의 데이터가 내 ListView의 맨 위로 점프하는지 파악할 수 없었습니다. – Cyrille

관련 문제