从按钮OnClick方法中访问listview / arrayadapter

时间:2014-10-31 02:46:40

标签: java android listview onclick android-arrayadapter

这可能是一个有点愚蠢的问题,但我有点难以理解如何引用我创建的listview / adapter。我首先创建了一个自定义列表视图,它允许我显示包含图片和文本的列表项。我在网上发现了很多很棒的教程,所以这部分并不算太糟糕。然后我在listview的底部添加了两个按钮,我想用它来操作listview中的数据。现在,当我在列表的onItemClickListener时,我可以弄清楚如何访问列表,因为您只需调用parent.getItemAtPosition(position)即可访问它。我不太确定如何在按钮的onClick方法中访问此列表,因为父/位置不作为参数传递。所以我想我的第一个问题是......

  1. 如何正确访问我在按钮onClick方法中创建的listview / arrayadapter。
  2. 我一直在努力解决的另一个问题是如何通过搜索包含该行的特定元素的值来搜索列表视图中的项目(行)。例如,在我下面的代码中,我创建的行有五个图像,两个文本字段和一个布尔值。那么我将如何搜索我的列表以查找具有555555“地址”的行,该行对应于Harley Davidson列表条目。

    我在下面提供了我的代码。非常感谢您的帮助。

    HelmetList.java

    public class HelmetList
    {
        public HelmetList (String name, String address, String img_hel, String img_rec, String img_bat,
                                String img_dsk, String img_str, Boolean selected)
        {
            super();
            this.name       = name;
            this.address    = address;
            this.img_hel    = img_hel;
            this.img_rec    = img_rec;
            this.img_bat    = img_bat;
            this.img_dsk    = img_dsk;
            this.img_str    = img_str;
            this.selected   = selected;
        }
    
        private String name;
        private String address;
        private String img_hel;
        private String img_rec;
        private String img_bat;
        private String img_dsk;
        private String img_str;
        private Boolean selected;
    
        public String getName ()
        {
            return name;
        }
    
        public void setName (String s_name)
        {
            this.name = s_name;
        }
    
        public String getAddress ()
        {
            return address;
        }
    
        public void setAddress (String s_address)
        {
            this.address = s_address;
        }
    
        public String getImgHel ()
        {
            return img_hel;
        }
    
        public void setImgHel (String s_img_hel)
        {
            this.img_hel = s_img_hel;
        }
    
        public String getImgRec ()
        {
            return img_rec;
        }
    
        public void setImgRec (String s_img_rec)
        {
            this.img_rec = s_img_rec;
        }
    
        public String getImgBat ()
        {
            return img_bat;
        }
    
        public void setImgBat (String s_img_bat)
        {
            this.img_bat = s_img_bat;
        }
    
        public String getImgDsk ()
        {
            return img_dsk;
        }
    
        public void setImgDsk (String s_img_dsk)
        {
            this.img_dsk = s_img_dsk;
        }
    
        public String getImgStr ()
        {
            return img_str;
        }
    
        public void setImgStr (String s_img_str)
        {
            this.img_str = s_img_str;
        }
    
        public Boolean getSelected ()
        {
            return selected;
        }
    
        public void setSelected (Boolean s_selected)
        {
            this.selected = s_selected;
        }
    }
    

    HelmetListAdapter.java

    public class HelmetListAdapter extends ArrayAdapter<HelmetList>
    {
        private int resource;
        private LayoutInflater inflater;
        private Context context;
    
        public HelmetListAdapter (Context p_context, int p_resource, List<HelmetList> p_objects)
        {
            super (p_context, p_resource, p_objects);
            resource = p_resource;
            inflater = LayoutInflater.from (p_context);
            context = p_context;
        }
    
        @Override
        public View getView (int position, View convertView, ViewGroup parent)
        {
            convertView = ( RelativeLayout ) inflater.inflate( resource, null );
            HelmetList Helmet = getItem (position);
    
            TextView hname = (TextView) convertView.findViewById(R.id.h_name);
            hname.setText(Helmet.getName ());
    
            TextView haddress = (TextView) convertView.findViewById(R.id.h_address);
            haddress.setText(Helmet.getAddress ());
    
            ImageView himage = (ImageView) convertView.findViewById(R.id.h_image);
            String uri = "drawable/" + Helmet.getImgHel();
            int imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName());
            Drawable image = context.getResources().getDrawable(imageResource);
            himage.setImageDrawable(image);
    
            ImageView hrec = (ImageView) convertView.findViewById(R.id.h_rec);
            uri = "drawable/" + Helmet.getImgRec();
            imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName());
            image = context.getResources().getDrawable(imageResource);
            hrec.setImageDrawable(image);
    
            ImageView hlbat = (ImageView) convertView.findViewById(R.id.h_lb);
            uri = "drawable/" + Helmet.getImgBat();
            imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName());
            image = context.getResources().getDrawable(imageResource);
            hlbat.setImageDrawable(image);
    
            ImageView hldsk = (ImageView) convertView.findViewById(R.id.h_ld);
            uri = "drawable/" + Helmet.getImgDsk();
            imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName());
            image = context.getResources().getDrawable(imageResource);
            hldsk.setImageDrawable(image);
    
            ImageView hstr = (ImageView) convertView.findViewById(R.id.h_str);
            uri = "drawable/" + Helmet.getImgStr();
            imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName());
            image = context.getResources().getDrawable(imageResource);
            hstr.setImageDrawable(image);
    
            return convertView;
    
        }
    }
    

    MainActivity.java

    public class MainActivity extends Activity
    {
        private ListView lvhelmets;
        private HelmetListAdapter adhelmets;
        private Context ctx;
        List<Integer> selected;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ctx = this;
    
            List<HelmetList> helmetlist = new ArrayList<HelmetList>();
            helmetlist.add(new HelmetList("Bell", "11111", "helmetpic0", "rec",
                    "bat", "mm", "str", Boolean.FALSE));
            helmetlist.add(new HelmetList("Shoei", "33333", "helmetpic1", "rec",
                                            "bat", "mm", "str", Boolean.FALSE));
            helmetlist.add(new HelmetList("Harley Davidson", "55555", "helmetpic2", "rec",
                                            "bat", "mm", "str", Boolean.FALSE));
            helmetlist.add(new HelmetList("Joe Rocket", "77777", "helmetpic3", "rec",
                    "bat", "mm", "str", Boolean.FALSE));
    
    
            lvhelmets = (ListView) findViewById(R.id.Helmet_list);
            lvhelmets.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
    
            adhelmets = new HelmetListAdapter(ctx, R.layout.row_format, helmetlist);
            lvhelmets.setAdapter (adhelmets);
    
            Button price = (Button) findViewById(R.id.bPrice);
            Button safety = (Button) findViewById(R.id.bSafety);
    
            price.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                    Toast.makeText(MainActivity.this, "price", Toast.LENGTH_SHORT).show();
                }
            });
    
            safety.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                    Toast.makeText(MainActivity.this, "safety", Toast.LENGTH_SHORT).show();
                }
            });
    
    
    
            lvhelmets.setOnItemClickListener(new OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id)
                {
                    HelmetList helmet = (HelmetList) parent.getItemAtPosition(position);
    
                    if (!helmet.getSelected())
                    {
                        view.setBackgroundColor(Color.LTGRAY);
                        helmet.setSelected(Boolean.TRUE);
                    }
                    else
                    {
                        view.setBackgroundColor(Color.TRANSPARENT);
                        helmet.setSelected(Boolean.FALSE);
                    }
                }
            });
    
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    }
    

    activity_main.xml中

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <ListView
            android:id="@+id/Helmet_list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:paddingTop="5dp"
            android:choiceMode="multipleChoice"
            android:layout_weight="1">
        </ListView>
    
        <LinearLayout
            android:id="@+id/btnHolderLL"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/bPrice"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:paddingRight="1dp"
                android:paddingLeft="1dp"
                android:textColor="#FFFFFF"
                android:background="#222222"
                android:text="Price"
                android:clickable="true" />
    
            <Button
                android:id="@+id/bSafety"
                android:layout_width="1dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:paddingRight="1dp"
                android:paddingLeft="1dp"
                android:textColor="#FFFFFF"
                android:background="#222222"
                android:text="Safety"
                android:clickable="true" />
        </LinearLayout>
    
    </LinearLayout>
    

    row_format.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="5dip" >
    
        <!--  ListRow Left side Thumbnail image -->
        <LinearLayout android:id="@+id/thumbnail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="3dip"
            android:layout_alignParentLeft="true"
            android:layout_marginRight="5dip">
            <ImageView
                android:id="@+id/h_image"
                android:layout_width="50dip"
                android:layout_height="50dip"
                android:layout_marginLeft="5dip"/>
        </LinearLayout>
    
        <TextView
            android:id="@+id/h_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/thumbnail"
            android:layout_toRightOf="@+id/thumbnail"
            android:textColor="#040404"
            android:typeface="sans"
            android:textSize="20dip"
            android:layout_marginTop="5dip"
            android:textStyle="bold"/>
    
        <TextView
            android:id="@+id/h_address"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/h_name"
            android:textColor="#343434"
            android:textSize="12dip"
            android:layout_marginTop="1dip"
            android:layout_toRightOf="@+id/thumbnail"  />
    
        <ImageView
            android:id="@+id/h_rec"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dp"
            android:layout_centerVertical="true" />
    
        <ImageView
            android:id="@+id/h_lb"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="45dp"
            android:layout_centerVertical="true" />
    
        <ImageView
            android:id="@+id/h_ld"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="85dp"
            android:layout_centerVertical="true" />
    
        <ImageView
            android:id="@+id/h_str"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="125dp"
            android:layout_centerVertical="true" />
    </RelativeLayout>
    

2 个答案:

答案 0 :(得分:0)

如果“整数列表”用于保存所选项的索引,则在ListViews onItemClicked侦听器中,选择一个时将位置添加到“整数列表”中。

使您的HelmetLists列表成为您的Activity中的一个字段。这样,当您按下两个按钮中的任何一个时,您既可以获得所需HelmetList的索引,也可以从中检索每个对象的列表。如果您允许进行多项选择,在您的方案中不确定。

答案 1 :(得分:0)

onClick方法中,尝试:

lvhelmets.setAdapter(new HelmetListAdapter(ctx, rowf_format.xml, helmetList));

这会调用你的适配器,它将填充listview