2013-12-09 3 views
2

Android GridView에 이상한 문제가 있습니다. 3x4 격자를 만들고 그 격자에 단추를 삽입합니다. 사용자가 버튼을 클릭 할 때 버튼의 배경이 변경되기를 원합니다. 그리고 이것은 첫 번째 버튼 (인덱스 0 - 왼쪽 상단)을 제외한 모든 버튼에서 잘 작동합니다. OnClick 이벤트 리스너는 내가하는 일에 상관없이 해당 버튼에 대해 전혀 실행되지 않습니다. 내가Android GridView의 첫 번째 버튼이 작동하지 않습니다.

imageView = (Button) convertView; 

여전히

imageView = new Button(mContext); 
다음

온 클릭() 트리거됩니다하지만 배경을 교체 할 경우

public View getView(int position, View convertView, ViewGroup parent) { 
    Button imageView; 

    if (convertView == null) { // if it's not recycled, initialize some attributes 
     Log.w("NOVO", "narejena nova celica"); 
     imageView = new Button(mContext); 

     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     Log.w("STARO", "stara celica"); 
     imageView = (Button) convertView; 
    } 

    imageView.setEnabled(true); 

    int visina = parent.getHeight(); 
    int sirina = parent.getWidth(); 

    float dip = mContext.getResources().getDisplayMetrics().density; 
    float margin = 10*dip; 

    int view_height = (int)(visina - 3*margin)/4; 
    int view_width = (int)(sirina - 2*margin)/3; 

    int view_dim = 0; 
    if (view_height <= view_width) 
     view_dim = view_height; 
    else 
     view_dim = view_width; 

    imageView.setLayoutParams(new GridView.LayoutParams(view_dim, view_dim)); 

    imageView.setId(position); 
    imageView.setOnClickListener(celice.get(position)); 
    /*imageView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Toast toast = Toast.makeText(mContext, v.getId() + "bla", Toast.LENGTH_SHORT); 
      //toast.show(); 
      celice.get(v.getId()).celicaVisible(4000); 
     }});*/ 

    celice.get(position).id = position; 
    celice.get(position).setButton(imageView); 

    return imageView; 
} 

: 여기

내가보기를 만드는 코드입니다 변경되지 않습니다. 다른 모든 단추는 예상대로 작동합니다. 배경을 변경 ...

public class Celica implements OnClickListener { 

public boolean odkrit; 
public boolean najden; 
public int id; 
public Drawable slikca1, slikca2; 
public Celica par; 
private Timer tim; 
public Button but; 
public Context con; 
static int buttonsVisible = 0; 

Celica(Drawable s1, Drawable s2) { 
    this.slikca1 = s1; 
    this.slikca2 = s2; 
} 

void celicaVisible(int millis) { 
    if (odkrit) 
     return; 

    Log.w("TEST", "prizganih " + buttonsVisible); 
    if (buttonsVisible >= 2) 
     return; 

    odkrit = true; 
    buttonsVisible++; 
    tim = new Timer(); 
    tim.schedule(new timerDone(), millis); 

    ((Activity)con).runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       but.setBackground(slikca2); 
      } 
    }); 

} 

void setButton(Button b) { 
    but = b; 

    ((Activity)con).runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      but.setBackground(slikca1); 
     } 
}); 
} 

class timerDone extends TimerTask { 

    @Override 
    public void run() { 
     if (!najden) { 
      odkrit = false; 

      ((Activity)con).runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         but.setBackground(slikca1); 
        } 
      }); 
     } 

     buttonsVisible--; 
     tim.cancel(); 
    } 

} 

@Override 
public void onClick(View v) { 
    celicaVisible(4000); 
} 

} 안드로이드에서

+0

그냥'Button '대신'TextView'를 사용하십시오. –

+0

왜 다른가요? 나는 그것을 시험해 보았다 - 변화 없음. – user3082900

+0

@ user3082900 내 대답을 확인하십시오 ... –

답변

0

I처럼 쓸 수 ... 버튼에 0보다 큰 수있는 ID를 설정하려고 한 번 시도 그것을 알아 내었다. Celica 객체 생성시 실제 버튼을 저장하는 대신 onClick() 메소드가 제공하는 뷰를 사용하면 모든 것이 작동합니다.

그래서 기본적 추가 다음의 onclick() 메소드

but = (Button) v; 

문제를 해결했다.

0

, 어떤 View의 ID가 아닌 0이어야합니다 - 여기

그리고

는 실제 작업을 담당 사용자 정의 클래스 "Celica는"입니다 및 음수가 아닙니다. 보기 ID는> 0이어야 의미하고 위치는 0 일 때 0이됩니다 버튼을 여기

imageView.setId(position) 

ID와 같은 버튼에 ID를 설정할 때 문제가있다 (첫 번째 항목을 의미한다). 이 원인 일 수 있습니다, 첫 번째 버튼의 OnClickListener를가 해고되지 ...

실제로

imageView.setId(position+1) to ensure ID > 0 
+0

나는 그것을 몰랐습니다. 그러나 슬프게도 아무것도 바뀌지 않습니다. – user3082900

+0

@ user3082900 코드에서 celice 란 무엇입니까? –

+0

실제 작업을 수행하는 사용자 정의 클래스의 ArrayList입니다. 원래 게시물을 업데이트하여 클래스가 어떻게 보이는지 알려줍니다. – user3082900

관련 문제