2012-04-12 3 views
0

TextView, 2 CheckBox 및 Spinner가있는 행이있는 ListView가 필요한 앱을 개발 중입니다. 그것은이 각 행에 표시 될 때마다 호출되는으로안드로이드에서 ListView 작업 내에서 Spinner를 얻는 방법?

그러나, 나는 스피너의 onItemSelected()에 문제가 발생하고있다. 이 메소드에서는 데이터베이스 레코드를 선택된 옵션으로 업데이트하지만 안드로이드가 자동으로 호출하므로 안드로이드가 위치 0을 호출하고 항목이 데이터베이스에서 업데이트 된 값이므로 항목이 재설정 될 때마다 자동으로 호출됩니다.

나는 onItemSelected()의 문제와 일부 해킹에 대한 링크를 많이 읽고,하지만 그들 모두는 ListView를하지 않고 사용한다. 여기에 어떤 포인트가 있습니까?

나는 위치가 실제로 작동하도록 표시되는 목록에서 추적 시도했지만 그렇지 않습니다. 안드로이드의 재활용으로 인해 문제 해결 방법이 이미 나와있는 Spinners가 필요하다는 생각이 들었습니다!

요점은 입니다. 회 전자를 표시 할 때 Android 전화에서 사용자를 선택했기 때문에 onItemSelected()으로 실제 전화를 구분할 수 있습니까? 여기

는 SimpleCursorAdapter를 확장 내 어댑터의 코드입니다.

미리 감사드립니다.

public ParticipationAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    mActivity = (Activity)context; 
    ParticipationComment.ParticipationCommentManager commentManager = new ParticipationComment.ParticipationCommentManager(mActivity); 
    mParticipationCommentsCursor = commentManager.get(); 
    mActivity.startManagingCursor(mParticipationCommentsCursor); 
    commentManager.detach(); 
    mPositionsOfCursorIds = getPositionsOfCursorIds(mParticipationCommentsCursor); 
    mSpinnerPositionsDisplayed = new ArrayList<Integer>(); 
} 

@Override 
public View getView(final int participationPosition, View convertView, ViewGroup parent) { 
    final Cursor participationsCursor = getCursor(); 
    mActivity.startManagingCursor(participationsCursor); 
    participationsCursor.moveToPosition(participationPosition); 
    View participationRow; 
    if (convertView == null) { 
     participationRow = LayoutInflater.from(mActivity).inflate(R.layout.participation_row_student, null); 
    } else { 
     mSpinnerPositionsDisplayed.remove((Integer)convertView.getTag()); 
     participationRow = convertView; 
    } 
    participationRow.setTag(participationPosition); 
    Spinner commentSpinner = (Spinner)participationRow.findViewById(R.id.participation_comment_id_spinner); 
    SimpleCursorAdapter commentSpinnerAdapter = new SimpleCursorAdapter(
      mActivity, 
      android.R.layout.simple_spinner_item, 
      mParticipationCommentsCursor, 
      new String[] {DatabaseManager.NAME}, 
      new int[] {android.R.id.text1} 
    ); 
    commentSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    commentSpinner.setAdapter(commentSpinnerAdapter); 
    long participationCommentId = participationsCursor.getLong(participationsCursor.getColumnIndex(DatabaseManager.PARTICIPATION_COMMENT_ID)); 
    if (participationCommentId != 0) { 
     commentSpinner.setSelection(mPositionsOfCursorIds.get(participationCommentId)); 
    } 
    commentSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      participationsCursor.moveToPosition(participationPosition); 
      if (!mSpinnerPositionsDisplayed.contains(participationPosition)) { 
       // Android calls this method the first time a Spinner is displayed, 
       // to differentiate from a real user click we check if the current Spinner's position 
       // in the ListView is being shown 
       mSpinnerPositionsDisplayed.add(participationPosition); 
      } else { 
       ParticipationComment participationComment = new ParticipationComment((Cursor)parent.getItemAtPosition(position)); 
       Participation.ParticipationManager participationManager = new Participation.ParticipationManager(mActivity); 
       Participation participation = new Participation(participationsCursor); 
       participation.setConnectionProfileParticipationCommentId(participationComment.getConnectionProfileId()); 
       participation.setParticipationCommentId(participationComment.getIdOpenErp()); 
       participation.setChanged(true); 
       participationManager.update(participation); 
       participationManager.detach(); 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      // Not used 
     } 
    }); 
    TextView studentName = (TextView)participationRow.findViewById(R.id.participation_student_name); 
    studentName.setText(participationsCursor.getString(participationsCursor.getColumnIndex(DatabaseManager.NAME))); 
    CheckBox expectedPresent = (CheckBox)participationRow.findViewById(R.id.participation_expected_present_value); 
    expectedPresent.setChecked(participationsCursor.getInt(participationsCursor.getColumnIndex(DatabaseManager.EXPECTED_PRESENT)) == 1); 
    CheckBox present = (CheckBox)participationRow.findViewById(R.id.participation_present_value); 
    present.setChecked(participationsCursor.getInt(participationsCursor.getColumnIndex(DatabaseManager.PRESENT)) == 1); 
    return participationRow; 
} 

답변

3

더 좋은 방법은 그것에 AlertDialog 선택에 따라 변경 ..에 ..에 AlertDialog 변형을 사용하는 등의 this입니다 .. 그리고 처음의 텍스트와 같은 첫 번째 선택이있는 버튼을 만들

+0

답변 해 주셔서 감사합니다. 내일 나는 그것을 시도하고 당신에게 무언가를 말할 것입니다! 하지만 db 테이블에 원점 데이터가 있기 때문에'public AlertDialog.Builder setCursor (커서 커서, DialogInterface.OnClickListener listener, String labelColumn)'대신에 사용할 것입니다. 나는이 접근법을 통해 사용자가 선택 사항을 선택하지 못하게 할 수있을 것이라고 생각합니다. 실제로는 필요한 것이고 Spinner를 사용하여 불가능합니다. – Caumons

+0

@Caumons .. 행운을 빌어 요 .. – ngesh

+0

정말 고마워요! 마침내 당신이 제안한대로 단추와 alertDialogs ListView 내부 선택을 구현했습니다. 위대한 작품! 대화 상자에서'setSingleChoiceItems()'메서드를 사용했습니다. 기본 선택을 정의 할 수 있습니다. 나는 당신에게 +25의 대원을주기 위해 당신의 대답을 upvoted했고 받아 들였다! :) – Caumons

2

작은 플래그를 사용하여 ItemSelected의 첫 번째 호출을 삭제하는 것은 어떻습니까?

+0

와 내가 어떻게 할 수 이 작업을 수행? 나는 아이디어가 없어 ... :(이미 표시된 위치를 가진 목록을 추적하고 있습니다 ... 그래서 현재 위치가없고 onItemSelected()가 호출되면 Android에 의해 만들어집니다. 그것은 사용자 클릭이지만 ... 이미 안드로이드는 그것을 표시하고 이것이 나를 아프게 할 때 그것을 회상하는 것 같습니다! 이것은 안드로이드 (convertView)로 완료 한 재활용 패턴 때문에라고 생각합니다 – Caumons

+0

매번 카운터를 재설정해야한다고 생각합니다. 보기가 생성되거나 재활용됩니다 (어댑터의 getView 메소드). 각보기의 카운터를 유지하고 getView 메소드가보기를 요청할 때 재설정하십시오. 각보기의 첫 번째 이벤트를 버립니다. – Snicolas

+0

이 접근 방법으로 인해 왜냐하면 나는 리사이클을 구현하는 방법과 카운터를 재설정해야하는 위치를 정확히 모르기 때문에 @sandy가 제안한 다른 해결책을 시도하는 것이 훨씬 쉽습니다. 나는 Google 소년들이이 방법의 바람직하지 않은 행동을 개선해야한다고 생각하고 있습니다. .. 고마워 어쨌든! :) – Caumons

관련 문제