【问题标题】:Android studio: list view with check boxesAndroid Studio:带有复选框的列表视图
【发布时间】:2016-07-25 20:38:18
【问题描述】:

此活动包括输入一种成分(然后显示它)并选中它旁边的复选框。我有以下无法摆脱的错误(我一直在寻找解决方案 5 小时):

  1. 如果我按回键使键盘隐藏,当我单击搜索视图时,它不再显示,而是返回主屏幕并再次输入。

  2. 如果我选中一个复选框并滚动,则会随机选中其他复选框。

  3. 如何将我检查过的成分放入一个数组并将该数组发送到下一个活动?(activity_ingredient 列表)

代码如下:

package ro.mosgoreanu.andu.foodholic;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
import java.util.ArrayList;
import java.util.Arrays;

public class typing_window extends AppCompatActivity implements view.OnClickListener {

    private static Button button;
    String[] items;
    ArrayList<String> listItems;
    ArrayAdapter<String> adapter;
    ListView listView;
    EditText editText;

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

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);

        listView = (ListView) findViewById(R.id.listview);
        editText = (EditText) findViewById(R.id.txtsearch);

        initList();

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if(s.toString().equals("")){
                    initList();
                }
                else {
                    searchItem(s.toString());
                }
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.toString().equals("")){
                    initList();
                }
                else {
                    searchItem(s.toString());
                }
            }
            @Override
            public void afterTextChanged(Editable s) {
                if(s.toString().equals("")){
                    initList();
                }
                else {
                    searchItem(s.toString());
                }
            }
        });


    }

    public void buttononClick()
    {
        startActivity(new Intent("ro.mosgoreanu.andu.foodholic.ingredient_list"));
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                buttononClick();
                break;
        }
    }


    public void searchItem(String textToSearch){
        for(String item:items) {
            if(!item.contains(textToSearch)){
                listItems.remove(item);
            }
        }

        adapter.notifyDataSetChanged();
    }

    public void initList(){
        items = new String[]{"breadcumb","butter","capiscum","carrot","cheese","cherry","chicken cutlets","cucumber","egg","flour","garlic","ham","lemon juice","mayonnaise","milk","mushroom","onion (red)","onion (white)","peas","pepper","pork","pickles","potato (red)","potato (white)","soy sauce","tomato","yogurt"};
        listItems = new ArrayList<>(Arrays.asList(items));
        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.txt, listItems );
        listView.setAdapter(adapter);
    }
}

以及活动的 xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout  xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="ro.mosgoreanu.andu.foodholic.typing_window"
android:background="#89913f">

<include layout="@layout/content_typing_window" />

<EditText
    android:id="@+id/txtsearch"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Search Ingredient"
    android:textAlignment="textStart"
    android:paddingLeft="50dp"
    android:layout_toLeftOf="@+id/imageButton"
    android:layout_toStartOf="@+id/imageButton"
    android:allowUndo="true" />
<SearchView
    android:id="@+id/search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:paddingEnd="0dp"
    android:paddingLeft="0dp"
    android:translationY="-5dp"
    android:focusable="true"
    android:clickable="true" />

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="View list"
    android:id="@+id/button"
    android:layout_marginRight="26dp"
    android:layout_marginEnd="26dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:background="#00ffffff"
    android:translationX="280dp"
    android:translationY="-2dp"
    android:clickable="true"
    android:allowUndo="true" />

<ListView
    android:id="@+id/listview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/searchView"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:foregroundTint="#ffffff"
    android:paddingTop="50dp" />

</android.support.design.widget.CoordinatorLayout>

和布局xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="match_parent"
  android:layout_height="match_parent">

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="19dp"
    android:text="Add"
    android:id="@+id/checkBox"
    android:layout_gravity="right"
    android:translationY="25dp"
    android:translationX="0dp"
    android:layout_marginLeft="280dp"
    android:focusable="false"/>

<TextView
    android:id="@+id/txt"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    />


 </LinearLayout>

【问题讨论】:

  • 对于#2,发布您的适配器的代码

标签: java android listview search android-studio


【解决方案1】:

嘿,我已经使用 ArrayAdapter 和 SearchViewHolder 完成了一项 检查它并提供任何响应。

MainActivity.java

 import android.content.Context;
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.TextView;

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {

        private static Button button;
        String[] items;
        private Fruits[] itemss;
        ArrayList<String> listItems;
        ArrayAdapter<Fruits> adapter;
        ListView listView;
        EditText editText;

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

            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(this);

            listView = (ListView) findViewById(R.id.listview);
            editText = (EditText) findViewById(R.id.txtsearch);
            initList();

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Fruits it = adapter.getItem(position);
                    it.toggleChecked();
                    SelectViewHolder viewHolder = (SelectViewHolder) view.getTag();
                    viewHolder.getCheckBox().setChecked(it.isChecked());
                }
            });
        }


        private void initList() {
            itemss = (Fruits[]) getLastNonConfigurationInstance();


            ArrayList<Fruits> items = new ArrayList<Fruits>();

            items.add(new Fruits("breadcumb"));
            items.add(new Fruits("butter"));
            items.add(new Fruits("capiscum"));
            items.add(new Fruits("carrot"));
            items.add(new Fruits("cheese"));
            items.add(new Fruits("cherry"));
            items.add(new Fruits("chicken cutlets"));
            items.add(new Fruits("cucumber"));
            items.add(new Fruits("egg"));
            items.add(new Fruits("flour"));
            items.add(new Fruits("garlic"));
            items.add(new Fruits("ham"));
            items.add(new Fruits("lemon juice"));
            items.add(new Fruits("mayonnaise"));
            items.add(new Fruits("milk"));
            items.add(new Fruits("mushroom"));
            items.add(new Fruits("onion (red)"));
            items.add(new Fruits("onion (white)"));
            items.add(new Fruits("peas"));
            items.add(new Fruits("pepper"));
            items.add(new Fruits("pork"));
            items.add(new Fruits("pickles"));
            items.add(new Fruits("potato (red)"));
            items.add(new Fruits("potato (white)"));
            items.add(new Fruits("soy sauce"));
            items.add(new Fruits("tomato"));
            items.add(new Fruits("yogurt"));

            adapter = new ActivityAdapter(this, items);
            listView.setAdapter(adapter);

            editText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    MainActivity.this.adapter.getFilter().filter(s);
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });


        }

        private static class Fruits {
            private String name = "";
            private boolean checked = false;

            public Fruits() {
            }

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

            public Fruits(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;
            }
        }

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

    private static class ActivityAdapter extends ArrayAdapter<Fruits>{

        private LayoutInflater inflater;

        public ActivityAdapter(Context context, List<Fruits> list) {
            super(context, R.layout.content_typing_window, R.id.txt, list);
            inflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Fruits fruit = (Fruits) this.getItem(position);

            CheckBox checkBox;
            TextView textView;

            if (convertView == null) {
                convertView = inflater.inflate(R.layout.content_typing_window, null);


                textView = (TextView) convertView
                        .findViewById(R.id.txt);
                checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);

                convertView.setTag(new SelectViewHolder(textView, checkBox));
                checkBox.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox) v;
                        Fruits li = (Fruits) cb.getTag();
                        li.setChecked(cb.isChecked());
                    }
                });
            }
            else {
                SelectViewHolder viewHolder = (SelectViewHolder) convertView
                        .getTag();
                checkBox = viewHolder.getCheckBox();
                textView = viewHolder.getTextView();
            }

            checkBox.setTag(fruit);
            checkBox.setChecked(fruit.isChecked());
            textView.setText(fruit.getName());
            return convertView;
        }
    }





        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button:
                    break;
            }
        }



    //    public void initList(){
    //        items = new String[]{"breadcumb","butter","capiscum","carrot","cheese","cherry"
    //                ,"chicken cutlets","cucumber","egg","flour","garlic","ham","lemon juice","mayonnaise",
    //                "milk","mushroom","onion (red)","onion (white)","peas","pepper","pork","pickles","potato (red)",
    //                "potato (white)","soy sauce","tomato","yogurt"};
    //        listItems = new ArrayList<>(Arrays.asList(items));
    //        adapter = new ArrayAdapter<mItems>(this, R.layout.content_typing_window, R.id.txt, listItems );
    //        listView.setAdapter(adapter);
    //    }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();

            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }



    }

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多