2013-07-02 2 views
0

왼쪽에는 ImageView가 있고 다음은 EditText가있는 사용자 정의 listview가 있고 오른쪽에는 다른 ImageView가 있습니다. 출처.목록보기에서 클릭 한 항목의 이미지 리소스를 변경하는 방법

그럼이 뷰에는 onItemClickListener가 있습니다. 항목 클릭에 대한 오른쪽 (처음에는 소스가없는 이미지 뷰)의 소스를 변경하고 싶습니다.

는이를 위해이 코드를 구현 : 항목을 클릭에

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      ImageView icone2 = (ImageView) view.findViewById(R.id.icone2_lugar); 
      icone2.setImageResource(R.drawable.flag_origem); 
    } 

이미지 뷰는 succefully 삽입됩니다. 그러나 목록을 아래로 스크롤하면 목록을 스크롤하기 전에 클릭 한 것과 같은 위치에있는 다른 모든 요소도 이미지 리소스를 변경한다는 것을 알게되었습니다.

왜 그런가? 안드로이드는 같은 시간에 모든 요소보기를로드하는 대신 목록을 스크롤하는 것처럼 새로운보기를로드합니다. 따라서 onItemClick의 View 매개 변수를 사용하여 목록의 요소 자원을 변경할 수 없습니다.

그래서 목록보기에서 클릭 된 요소의 리소스를 어떻게 변경할 수 있습니까?

편집 :

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

     View linha = convertView; 
     ArmazenadorLugar armazenador = null; 

     if (linha == null) { 
      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      linha = inflater.inflate(R.layout.linha_lugar, parent, false); 
      armazenador = new ArmazenadorLugar(linha); 
      linha.setTag(armazenador); 
     } else { 
      armazenador = (ArmazenadorLugar) linha.getTag(); 
     } 

     armazenador.popularFormulario(mListaLugares.get(position), mContext); 

     return linha; 
    } 

    public LugarAndroid getItem(int position) { 
     return mListaLugares.get(position); 
    } 
+0

당신이 발견 한대로, 뷰는 ListView에서 재활용됩니다. 내 자신의 사용자 지정 어댑터를 만들고 getView()를 재정의하고 거기에 선택 논리를 둡니다. –

+0

실제로이 목록은 이미 어댑터에 있으며 getView 메소드도 있습니다. 방금 말한 것을 ilustrate하기 위해 코드 조각을 게시 할 수 있습니까? getView에 전달해야하는 매개 변수는 int position, View convertView, ViewGroup parent –

+0

항목을 다시 클릭하면 어떻게됩니까? 아이콘을 다시 바꿔야합니까 아니면 그냥 그대로 유지해야합니까? –

답변

1

나는 다른 방식으로 그것을 끝내었다. 그것이 더 나은지 모르지만 그것은 효과적입니다.

이미지 리소스를 설정해야하는 요소 위치를 보유 할 어댑터에 변수 (imgPosition)를 만들었습니다. 의 getView이 메소드를 호출하기 때문에 그럼,이 요소에 클릭 할 때마다, 청취자, 나는 목록을 새로 고치려면 리스너에서의 getView 방법이라고

adapter.setImgPosition(position); 
    adapter.getView(position, view, parent); 

를 호출 목록을 업데이트 (I 옆을 설명 할 것이다). 나는 다음과 같은 논리를 가지고있는 어댑터 클래스의의 getView 방법에 는 (위치 요소의 getView 매개 변수에서 유래) :

static class Holder{ 
     private TextView txt1= null; 
     private ImageView img1 = null; 
     private ImageView img2 = null; 

     Holder(View linha) { 
      txt1= (TextView) linha.findViewById(R.id.txt1); 
      img1 = (ImageView) linha.findViewById(R.id.img1); 
      img2 = (ImageView) linha.findViewById(R.id.img2); 
     } 

     void setValues(LugarAndroid lugar, Context mContext, boolean setImg) { 
      img2.setImageResource(0); 
      if(setImg) img2.setImageResource(R.drawable.flag); 

      // Logic to fill up the others views 
     } 

난 단지 이미지를 설정합니다이 방법 : 홀더에

holder.setValues(mListaLugares.get(position), mContext, imgPosition == position); 

전달 된 부울 값이 true 일 때 클릭 한 요소의 리소스입니다.

0

당신이 Object의 목록과 어댑터를 사용하는 경우 사용할 수 있습니다

getItem(position)을 다음이 특정 개체의 이미지 뷰의 이미지를 변경

+0

고마워요! 하지만 getItem은 목록의 어떤 요소가 나타내는 객체 만 반환합니다. 이 객체와 관련된 뷰를 가져야합니다. 그렇지 않아야합니까? –

+0

UI가 초기화되는 방식은 무엇입니까?코드 (객체/어댑터) 게시 – marshallino16

+0

어댑터의 두 가지 방법으로 질문을 편집했습니다 –

관련 문제