3

チェックボックスと検索機能を備えたリストビューを作成しました。検索は正常に機能しており、チェックボックスも表示されています。今私が欲しいのは、ボタンのクリックですべてのチェックされたリスト項目の名前を取得したいということです。また、アイテム名の下に価格など、別のテキストビューを表示する方法を知りたいです。

メインレイアウト

<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>

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>

活動: _

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




}

望ましい結果を得るにはどうすればよいですか?

4

2 に答える 2

1

ArrayList または SparseArray を使用するカスタム アダプタでチェックボックスの状態を保持する必要があります。次に、すべてのチェック項目の名前を取得する場合は、配列を走査して、checked パラメータが true である名前を読み取るだけです。もちろん、チェックボックスの状態が変化したときにリストを更新する必要があります。

画面に表示される ListView アイテムはほとんどないため、これが唯一の適切な解決策です。そのため、その場でプロパティを読み取ろうとするのは信頼できません。いつでもアイテムがリサイクルされてアクセスできなくなる可能性があります。

于 2013-08-02T07:35:33.640 に答える
1

今私が欲しいのは、ボタンのクリックですべてのチェックされたリスト項目の名前を取得したいということです。

itemss配列を繰り返し処理して、checkedフィールドがである項目を取得してみませんtrueか?

また、アイテム名の下に価格など、別のテキストビューを表示する方法を知りたいです。

simplerow.xmlあなたの(価格を追加するTextView)とあなたのSelectViewHolderそしてそのために更新してくださいSelectArralAdapter

これらをコーディングするのはそれほど難しいことではないと思います。

于 2014-02-23T18:17:43.093 に答える