2016-08-22 1 views
0

単純なアプリケーションでJavaとAndroidの紹介を通して自分のやり方を変え、ListViewアイテムの選択に問題が発生しました。私の活動の1つとして、2つのボタンがあり、そのうち1つは「削除」ボタンであり、「通過」のリストビューは、デバイスがセンサーを通過したときのタイムスタンプです。削除時に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で見つけたいくつかのメソッドを試しましたが、リストから正しい項目を削除することはできますが、呼び出し後も選択項目で終わりますdelete()。

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

関連する問題