Java android中带有复选框的列表视图中的选定项目

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18011195/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 21:47:07  来源:igfitidea点击:

Selected items from listview with checkbox in android

javaandroidlistviewcheckbox

提问by kittu88

I have created a listview with checkboxes and search functionality. The search is working fine, the checkboxes are also showing. Now what I want is, I want to get the names of all the checked list items onclick of a button. I also want to know how will it be possible to show another textview, say price below item name.

我创建了一个带有复选框和搜索功能的列表视图。搜索工作正常,复选框也显示。现在我想要的是,我想通过单击按钮获取所有选中列表项的名称。我还想知道如何显示另一个文本视图,在项目名称下方说价格。

The main layout:

主要布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- Editext for Search -->

    <EditText
        android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Search products.."
        android:inputType="textVisiblePassword" />

    <ListView
        android:id="@+id/mainListView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </ListView>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:onClick="showResult"
        android:text="Show Result" >
    </Button>

</LinearLayout>

The simplerow.xmlfile:

simplerow.xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <TextView android:id="@+id/rowTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textStyle="bold"
    android:textSize="16sp" >
  </TextView>

  <CheckBox android:id="@+id/CheckBox01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dp"
    android:layout_alignParentRight="true" android:layout_marginRight="6sp"
    android:focusable="false">
  </CheckBox>

</RelativeLayout>

The activity:

活动

public class MultiSelectList extends Activity {

     // Search EditText
       EditText inputSearch;

    private ListView mainListView;
    private mItems[] itemss;
    private ArrayAdapter<mItems> listAdapter;
    ArrayList<String> checked = new ArrayList<String>();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Find the ListView resource.
        mainListView = (ListView) findViewById(R.id.mainListView);
        inputSearch = (EditText) findViewById(R.id.inputSearch);

        // When item is tapped, toggle checked properties of CheckBox and
        // Planet.
        mainListView
                .setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View item,
                            int position, long id) {
                        mItems planet = listAdapter.getItem(position);
                        planet.toggleChecked();
                        SelectViewHolder viewHolder = (SelectViewHolder) item
                                .getTag();
                        viewHolder.getCheckBox().setChecked(planet.isChecked());

                    }
                });

        // Create and populate planets.
        itemss = (mItems[]) getLastNonConfigurationInstance();

        ArrayList<mItems> planetList = new ArrayList<mItems>();

        planetList.add(new mItems("DJ- Android"));
        planetList.add(new mItems("Android"));
        planetList.add(new mItems("iPhone"));
        planetList.add(new mItems("BlackBerry"));
        planetList.add(new mItems("Java"));
        planetList.add(new mItems("PHP"));
        planetList.add(new mItems(".Net"));
        planetList.add(new mItems("Jhoomla"));

        // Set our custom array adapter as the ListView's adapter.
        listAdapter = new SelectArralAdapter(this, planetList);
        mainListView.setAdapter(listAdapter);

         /**
            * Enabling Search Filter
            * */
           inputSearch.addTextChangedListener(new TextWatcher() {

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

               @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                          
               }
           });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        menu.add(0, 1, Menu.NONE, "Products");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch (item.getItemId()) {
        case 1:

            for (int i = 0; i < checked.size(); i++) {
                Log.d("pos : ", "" + checked.get(i));
            }
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    /** Holds planet data. */
    private static class mItems {
        private String name = "";
        private boolean checked = false;

        public mItems() {
        }

        public mItems(String name) {
            this.name = name;
        }

        public mItems(String name, boolean checked) {
            this.name = name;
            this.checked = checked;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public boolean isChecked() {
            return checked;
        }

        public void setChecked(boolean checked) {
            this.checked = checked;
        }

        public String toString() {
            return name;
        }

        public void toggleChecked() {
            checked = !checked;
        }
    }

    /** Holds child views for one row. */
    private static class SelectViewHolder {
        private CheckBox checkBox;
        private TextView textView;

        public SelectViewHolder() {
        }

        public SelectViewHolder(TextView textView, CheckBox checkBox) {
            this.checkBox = checkBox;
            this.textView = textView;
        }

        public CheckBox getCheckBox() {
            return checkBox;
        }

        public void setCheckBox(CheckBox checkBox) {
            this.checkBox = checkBox;
        }

        public TextView getTextView() {
            return textView;
        }

        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    }

    /** Custom adapter for displaying an array of Planet objects. */
    private static class SelectArralAdapter extends ArrayAdapter<mItems> {
        private LayoutInflater inflater;

        public SelectArralAdapter(Context context, List<mItems> planetList) {
            super(context, R.layout.simplerow, R.id.rowTextView, planetList);
            // Cache the LayoutInflate to avoid asking for a new one each time.
            inflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Planet to display
            mItems planet = (mItems) this.getItem(position);

            // The child views in each row.
            CheckBox checkBox;
            TextView textView;

            // Create a new row view
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.simplerow, null);

                // Find the child views.
                textView = (TextView) convertView
                        .findViewById(R.id.rowTextView);
                checkBox = (CheckBox) convertView.findViewById(R.id.CheckBox01);
                // Optimization: Tag the row with it's child views, so we don't
                // have to
                // call findViewById() later when we reuse the row.
                convertView.setTag(new SelectViewHolder(textView, checkBox));
                // If CheckBox is toggled, update the planet it is tagged with.
                checkBox.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox) v;
                        mItems planet = (mItems) cb.getTag();
                        planet.setChecked(cb.isChecked());
                    }
                });
            }
            // Reuse existing row view
            else {
                // Because we use a ViewHolder, we avoid having to call
                // findViewById().
                SelectViewHolder viewHolder = (SelectViewHolder) convertView
                        .getTag();
                checkBox = viewHolder.getCheckBox();
                textView = viewHolder.getTextView();
            }

            // Tag the CheckBox with the Planet it is displaying, so that we can
            // access the planet in onClick() when the CheckBox is toggled.
            checkBox.setTag(planet);
            // Display planet data
            checkBox.setChecked(planet.isChecked());
            textView.setText(planet.getName());
            return convertView;
        }
    }

    public Object onRetainNonConfigurationInstance() {
        return itemss;
    }




}

What should I do to get the desired result?

我该怎么做才能得到想要的结果?

回答by Malachiasz

You should keep states of checboxes in your custom adapter, and which uses some ArrayList or SparseArray. Then when you want to get names of all check items you just traverse your array and read names where checked parameter is true. Of course the list should be updated when checkbox state changes.

您应该在自定义适配器中保留复选框的状态,并使用一些 ArrayList 或 SparseArray。然后,当您想获取所有检查项的名称时,您只需遍历数组并读取已检查参数为真的名称。当然,当复选框状态改变时,应该更新列表。

That's only proper solution, because only few ListView items are visibile on the screen, so trying to read their properties on the fly is unreliable - any moment item may be recycled thus become not accessible.

这只是正确的解决方案,因为只有少数 ListView 项目在屏幕上可见,因此尝试动态读取它们的属性是不可靠的 - 任何时刻项目都可能被回收,从而变得不可访问。

回答by Devrim

Now what I want is, I want to get the names of all the checked list items onclick of a button.

现在我想要的是,我想通过单击按钮获取所有选中列表项的名称。

Why don't you iterate over itemssarray and get the items which their checkedfield is true?

为什么不遍历itemss数组并获取其checked字段所在的项目true

I also want to know how will it be possible to show another textview, say price below item name.

我还想知道如何显示另一个文本视图,在项目名称下方说价格。

Update your simplerow.xml(add the price TextView) and also your SelectViewHolderand SelectArralAdapterfor that.

为此更新您的simplerow.xml(添加价格TextView)以及您的SelectViewHolderSelectArralAdapter

These shouldn't be very hard to code i guess.

我猜这些应该不难编码。