2016-08-22 3 views
0

간단한 응용 프로그램에서 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()를 통해 선택 펀트되는 항목을 추적하려고 몇 가지 문제에 달렸다. 그래서 내가 새로운 점으로, 내가보기에 대해 이해하지 못하는 것이 있거나 선택이 어떻게 작동하는지에 대한 오해와 같은 다른 것이있을 것이라고 확신합니다.

선택을 취소하려면 어떻게해야합니까?

감사합니다.

+0

나는 많은 배경을 제공했기 때문에 여기에 명확한 지점이 있습니다. 여기서 TLDR은 삭제 후 항목을 선택하지 않고 ListView 항목을 선택하고 삭제하려고한다는 것입니다. – sje

+0

notifyDataSetChanged(), "passagesListView.invalidateViews();"다음에 이것을 추가하십시오. –

+0

해당 통화에서 변경 사항이 없습니다. 강조 표시는 항목을 삭제 한 후에도 그대로 유지됩니다. – sje

답변

0

귀하의 PassagesViewAdapter 클래스가 어떻게 생겼는지 모르겠습니다. 어쩌면 당신은 시도해 볼 수 있습니다

passagesViewAdapter.remove(passages.get(selectedItemPos)); 
passages.remove(selectedItemPos); 
deleteButton.setEnabled(false); 
selectedItemPos = -1; 

passagesViewAdapter.notifyDataSetChanged(); 
+0

같은 결과가 발생합니다. 항목이 삭제되지만 같은 위치가 선택되어 있습니다. – sje

관련 문제