select 通过搜索查看多个联系人列表并发送给另一个 activity

select mutiple contact list by searchview and send to another activity

好的,我有一个可以正常工作的多选 ListView。我选中联系人的框(保存在 String[] 中)并且可以 return 值。因为有些人有很多联系人,所以我想创建一个搜索栏,有点像 Android phone 一本书的库存搜索栏。我创建了一个 EditText 并将其对齐到我的列表上方。我在 Whosebug 上找到了过滤代码,效果非常好。

我的问题:

当您过滤掉某人的名字并 select 名字时,当您从 EditText 退格或继续输入时,您 select 编辑的名字的正确位置不会被保存。例如,如果我开始输入 "Adam" 并到达 "Ada" 和 select,如果我退格以输入 "Carol",无论 "Ada" 处于什么位置select编辑。它会收集 "Adam" 所在的位置(假设为 2),当列表恢复时检查该位置 (2),即使 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) {

        }


    });
}

}

或许您可以使用唯一 ID。
在每个列表项中,您都可以有一个不可见的 TextView 来存储 ID。
单击将 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"/>

在您的 activity class 中添加以下变量:

static int uid;
int selectedId;

然后在初始化列表之前添加:

uid = 0;

在适配器中或您将视图添加到列表的任何方式:

TextView id = (TextView)yourListItem.findViewById(R.id.contactID);
id.setText(String.valueOf(uid));
uid++;

最后在列表项的onClickListener中添加:

TextView id = (TextView)yourListItem.findViewById(R.id.contactID);
selectedId = Integer.parseInt(id.getText().toString());

这样您以后就可以获取选定的列表项 - 通过比较选定的 ID。