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;
}
답변 해 주셔서 감사합니다. 내일 나는 그것을 시도하고 당신에게 무언가를 말할 것입니다! 하지만 db 테이블에 원점 데이터가 있기 때문에'public AlertDialog.Builder setCursor (커서 커서, DialogInterface.OnClickListener listener, String labelColumn)'대신에 사용할 것입니다. 나는이 접근법을 통해 사용자가 선택 사항을 선택하지 못하게 할 수있을 것이라고 생각합니다. 실제로는 필요한 것이고 Spinner를 사용하여 불가능합니다. – Caumons
@Caumons .. 행운을 빌어 요 .. – ngesh
정말 고마워요! 마침내 당신이 제안한대로 단추와 alertDialogs ListView 내부 선택을 구현했습니다. 위대한 작품! 대화 상자에서'setSingleChoiceItems()'메서드를 사용했습니다. 기본 선택을 정의 할 수 있습니다. 나는 당신에게 +25의 대원을주기 위해 당신의 대답을 upvoted했고 받아 들였다! :) – Caumons