간단한 응용 프로그램에서 Java 및 Android 소개를 진행하면서 ListView 항목 선택으로 문제가 발생했습니다. 내 액티비티 중에는 두 개의 버튼이있는 레이아웃이 있는데, 그 중 하나는 "삭제"버튼이고, "통과"의 ListView는 기본적으로 디바이스가 센서를 통과했을 때의 타임 스탬프입니다.삭제할 때 ListView 항목을 선택 취소 할 수 없습니다.
항목을 클릭하여 선택하고 "삭제"버튼을 활성화하는 기능을 구현했습니다. "삭제"버튼을 클릭하면 "통과"가 제거되지만 여전히 원하지 않는 선택한 항목으로 끝납니다.
는 선택을 구현하기 위해, 나는리스트 뷰에 다음 속성을 추가 :
android:id="@+id/passagesListView"
android:choiceMode="singleChoice"
android:listSelector="#666666"
선택은 OnItemClickListener를 통해 한 OnCreate에서 지원됩니다
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_passages);
passagesViewAdapter = new PassagesViewAdapter(this, R.layout.passages_row_layout, passages);
final ListView passagesListView = (ListView) findViewById(R.id.passagesListView);
assert passagesListView != null;
final Button deleteButton = (Button) findViewById(R.id.deleteButton);
deleteButton.setEnabled(false);
buildPassageList();
passagesListView.setAdapter(passagesViewAdapter);
passagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) {
Toast.makeText(ViewPassagesActivity.this, "position is " + position,
Toast.LENGTH_LONG).show();
view.setSelected(true);
passagesViewAdapter.notifyDataSetChanged();
selectedItemPos = position;
deleteButton.setEnabled(true);
}
});
}
이 부분의 작품. 그러나 삭제와 관련된 문제가 있습니다. 주석에서 볼 수 있듯이, 적용한 것처럼 보이는 StackOverflow에서 찾은 몇 가지 메서드를 시도했지만 목록에서 올바른 항목을 삭제할 수는 있지만 호출 후 선택한 항목으로 끝납니다 지우다().
public void delete (View view)
{
final Button deleteButton = (Button) findViewById(R.id.deleteButton);
ListView passagesListView = (ListView) findViewById(R.id.passagesListView);
if(selectedItemPos != -1)
{
Toast.makeText(ViewPassagesActivity.this, "remove " + selectedItemPos,
Toast.LENGTH_LONG).show();
// This did not work, which is strange since it worked similarly for selection when clicked
// View itemView = passagesListView.getChildAt(selectedItemPos);
View itemView = passagesViewAdapter.getView(selectedItemPos, null, passagesListView);
itemView.setSelected(false);
// This was also recommended in various posts on StackOverflow.
// Not clear whether clearChoices applies only to checkBoxes?
// passagesListView.clearChoices();
// passagesListView.requestLayout();
passages.remove(selectedItemPos);
deleteButton.setEnabled(false);
selectedItemPos = -1;
passagesViewAdapter.notifyDataSetChanged();
}}
}
또한 단지 인덱스 나 자신을 추적하여하는 setSelected()와 getSelectedItemPosition()를 통해 선택 펀트되는 항목을 추적하려고 몇 가지 문제에 달렸다. 그래서 내가 새로운 점으로, 내가보기에 대해 이해하지 못하는 것이 있거나 선택이 어떻게 작동하는지에 대한 오해와 같은 다른 것이있을 것이라고 확신합니다.
선택을 취소하려면 어떻게해야합니까?
감사합니다.
나는 많은 배경을 제공했기 때문에 여기에 명확한 지점이 있습니다. 여기서 TLDR은 삭제 후 항목을 선택하지 않고 ListView 항목을 선택하고 삭제하려고한다는 것입니다. – sje
notifyDataSetChanged(), "passagesListView.invalidateViews();"다음에 이것을 추가하십시오. –
해당 통화에서 변경 사항이 없습니다. 강조 표시는 항목을 삭제 한 후에도 그대로 유지됩니다. – sje