2016-03-23 15 views
-1

OK私はうまく動作する複数の選択肢ListViewを持っています。私は(String []に保持されている)連絡先のチェックボックスをチェックし、値を正しく返すことができます。一部の人々は連絡先の束を持っているので、私はAndroidの電話帳のためのストックバーのような検索バーの種類を作りたかった。私はEditTextを作成し、それを私のリストの上に揃えました。 StackOverflowでフィルタリングコードを見つけました。すばらしく機能します。複数の連絡先リストをsearchviewで選択して別のアクティビティに送信

私の問題:あなたのいずれかのEditTextからバックスペースやタイピングを続ける

あなたが誰かの名前をフィルタリングし、あなたが名前を選択し

は、あなたが選択した名前の正しい位置が保存されません。たとえば、「Adam」と入力して「Ada」に移動して選択すると、「Carol」を入力するとバックスペースに「Ada」の位置が選択されます。それは "Adam"がクリックから来た場所を集め(2と言う)、リストが復元されたときにAdamがもう存在しなくてもその位置(2)をチェックします。名前を収集する方法が必要です。リストが復元されたり、再び検索されると、NAME Adamがチェックされ、以前にAdamが位置付けされていません。私はたくさんの配列を作成する以外のアイデアは全く持っておらず、本当に役立つことがあります。

public class MainActivity extends Activity { 
    private static final String[] items={"lorem1", "ipsum1", "dolor1", 
      "sit1", "amet1","lorem2", "ipsum2", "dolor2", 
      "sit2", "amet2","lorem3", "ipsum3", "dolor3", 
      "sit3", "amet3","lorem4", "ipsum4", "dolor4", 
      "sit4", "amet4","lorem5", "ipsum5", "dolor5", 
      "sit5", "amet5","lorem6", "ipsum6", "dolor6", 
      "sit6", "amet6","pigeon","victory"}; 
    ListView list; 
    Button save; 
    EditText inputSearch; 
    SearchView searchview; 
    ArrayAdapter<String> adapter; 
    int textlength=0; 
    // private String my_sel_items; 
    ArrayList<String> selectedItems1 = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

adapter = (new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, items)); 

    list = (ListView) findViewById(R.id.list); 
    list.setEmptyView(findViewById(R.id.empty)); 
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    list.setAdapter(adapter); 
    list.setTextFilterEnabled(true); 

    inputSearch = (EditText) findViewById(R.id.inputSearch); 
    save = (Button) findViewById(R.id.save); 

    inputSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      MainActivity.this.adapter.getFilter().filter(cs); 

      textlength = inputSearch.getText().length(); 
      selectedItems1.clear(); 
      for (int i = 0; i < items.length; i++) { 
       if (textlength <= items[i].length()) { 
        if (inputSearch.getText().toString().equalsIgnoreCase(
          (String) 
            items[i].subSequence(0, 
              textlength))) { 
         selectedItems1.add(items[i]); 
        } 
       } 
      } 
      list.setAdapter(new ArrayAdapter<String> 
        (MainActivity.this, 
          android.R.layout.simple_list_item_multiple_choice, selectedItems1)); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); 

    save.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      SparseBooleanArray checked = list.getCheckedItemPositions(); 
      ArrayList<String> selectedItems = new ArrayList<String>(); 

      for (int i = 0; i < checked.size(); i++) { 

       int position = checked.keyAt(i); 

       if (checked.valueAt(i)) 
        selectedItems.add(adapter.getItem(position)); 

      } 

      String[] outputStrArr = new String[selectedItems.size()]; 

      for (int i = 0; i < selectedItems.size(); i++) { 
       outputStrArr[i] = selectedItems.get(i); 
      } 
      if (selectedItems.size() < 1) { 
       Toast.makeText(getApplicationContext(), "Select atleast one ", Toast.LENGTH_LONG).show(); 
      } else { 
       Intent intent = new Intent(MainActivity.this, Main2Activity.class); 

       Bundle b = new Bundle(); 
       b.putStringArray("selectedItems", outputStrArr); 

       intent.putExtras(b); 

       startActivity(intent); 
      } 
     } 
    }); 

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { 

     } 


    }); 
} 

}

+0

私はこの[スレッド](http://stackoverflow.com/questions/5122974/multiple-choice-searchable-listview/38027799#38027799)のソリューションを共有しています。 – ShivBuyya

答えて

0

おそらく、あなたはユニークなIDを使用することができます。
すべてのリスト項目に、IDを格納する目に見えないTextViewを持つことができます。
クリックすると、IDに変数が割り当てられ、後で使用することができます。
希望に役立ちます。
はあなたのリスト項目のXMLがようにしているとしましょう:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal"> 
<!-- Contact name --> 
<TextView 
    android:id="@+id/contactName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

<!-- Contact Unique ID --> 
<TextView 
    android:id="@+id/contactID" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:visibility="invisible"/> 

アクティビティクラスには、次の変数を追加するには:

static int uid; 
int selectedId; 

次に、リストの追加の初期化の前に:

uid = 0; 

をアダプターまたはビューにリストを追加する方法は、次のとおりです。

リスト項目のonClickListenerで
TextView id = (TextView)yourListItem.findViewById(R.id.contactID); 
id.setText(String.valueOf(uid)); 
uid++; 

そして最後に追加します。

​​

を後で選択リスト項目をフェッチすることができますこの方法 - 選択されたIDとを比較することによって。

+0

私はそれを得ることができません、あなたはサンプルコードを提供してくださいできますか? –

+0

関連サンプルを提供するために実装を確認する必要があります。 –

+0

回答を編集していただきありがとうございました –

関連する問題