setOnItemClickListener不能使用我的自定义适配器

时间:2015-05-21 14:32:27

标签: java android

我为ListView实现了一个自定义适配器,然后我使用了函数setOnItemClickListener和getItemAtPosition从特定列表项中提取对象。但是,当我点击特定的列表项时,没有任何反应。 以下是我的自定义适配器的外观:



 private class MyCustomAdapter extends ArrayAdapter<Werkzeug> {

        private ArrayList<Werkzeug> werkzeugList;

        public MyCustomAdapter(Context context, int textViewResourceId, ArrayList<Werkzeug> werkzeugList) {
            super(context, textViewResourceId, werkzeugList);
            this.werkzeugList = new ArrayList<Werkzeug>();
            this.werkzeugList.addAll(werkzeugList);
        }


        private class ViewHolder {
            CheckBox checkBox;
            ImageView imageView;
            TextView w_Name;
            TextView w_Preis;
            TextView w_Waehrung;
            TextView w_haeufigkeit;
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder = null;
            Log.v("ConvertView", String.valueOf(position));

            if (convertView == null) {

                LayoutInflater vi = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE );
                convertView = vi.inflate(R.layout.listview2_layout, null);

                holder = new ViewHolder();
                holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
                holder.imageView = (ImageView) convertView.findViewById(R.id.werkzeugeImage);
                holder.w_Name = (TextView) convertView.findViewById(R.id.werkzeugeName);
                holder.w_Preis = (TextView)convertView.findViewById(R.id.werkzeugePreis);
                holder.w_Waehrung = (TextView) convertView.findViewById(R.id.euro);
                holder.w_haeufigkeit = (TextView) convertView.findViewById(R.id.proTag);

                convertView.setTag(holder);

                preis_TextView = (TextView)findViewById(R.id.preis_textView);

                final Manager manager = (Manager)getApplication();

                preis_TextView.setText(Integer.toString(manager.getSum()));

                holder.checkBox.setOnClickListener(
                        new View.OnClickListener() {
                            public void onClick(View v) {
                                CheckBox cb = (CheckBox) v ;
                                Werkzeug werkzeug = (Werkzeug) cb.getTag();

                                if(cb.isChecked()) {
                                    manager.setSum( manager.getSum()+ Integer.parseInt(werkzeug.getPreis()) );
                                    preis_TextView.setText(Integer.toString(  manager.getSum() ));
                                    manager.listOfSelectedItems.put(werkzeug.getName(), werkzeug);
                                }
                                else {
                                    manager.setSum( manager.getSum()- Integer.parseInt(werkzeug.getPreis()) );
                                    preis_TextView.setText(Integer.toString(  manager.getSum() ));
                                    manager.listOfSelectedItems.remove(werkzeug.getName());
                                }

                                    werkzeug.setCheckBoxState(cb.isChecked());
                            }
                        });

            }
            else {
                holder = (ViewHolder) convertView.getTag();
            }

            Werkzeug werkzeug = werkzeugList.get(position);

            holder.imageView.setImageResource(werkzeug.getBild());
            holder.w_Name.setText(werkzeug.getName());
            holder.checkBox.setChecked(werkzeug.isCheckBoxState());
            holder.w_Preis.setText(werkzeug.getPreis());
            holder.w_Waehrung.setText(werkzeug.getWaehrung());
            holder.w_haeufigkeit.setText(werkzeug.getHauefigkeit());

            holder.checkBox.setTag(werkzeug);

            return convertView;

        }

    }
&#13;
&#13;
&#13;

这里是Werkzeug.java

&#13;
&#13;
public class Werkzeug {

    private String name;
    private String preis;
    private String waehrung;
    private String hauefigkeit;
    private int bild;
    private boolean checkBoxState = false;

    public Werkzeug ( String name, String preis, String waehrung, String hauefigkeit, int bild, boolean checkBoxState){

        this.name = name;
        this.preis = preis;
        this.waehrung = waehrung;
        this.hauefigkeit = hauefigkeit;
        this.bild = bild;
        this.checkBoxState = checkBoxState;
    }

    public String getName() {
        return name;
    }

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

    public String getPreis() {
        return preis;
    }

    public void setPreis(String preis) {
        this.preis = preis;
    }

    public String getWaehrung() {
        return waehrung;
    }

    public void setWaehrung(String waehrung) {
        this.waehrung = waehrung;
    }

    public String getHauefigkeit() {
        return hauefigkeit;
    }

    public void setHauefigkeit(String hauefigkeit) {
        this.hauefigkeit = hauefigkeit;
    }

    public int getBild() {
        return bild;
    }

    public void setBild(int bild) {
        this.bild = bild;
    }

    public boolean isCheckBoxState() {
        return checkBoxState;
    }

    public void setCheckBoxState(boolean checkBoxState) {
        this.checkBoxState = checkBoxState;
    }
}
&#13;
&#13;
&#13;

这里的函数在OnCreate()中,我调用了SetOnItemClickListener():

&#13;
&#13;
private void displayListView() {

    //Array list of Werkzeuge
    ArrayList<Werkzeug> werkzeugList = new ArrayList<Werkzeug>();

    for (int i = 0; i < werkzeuge_name.length; ++i){

        Werkzeug werkzeug = new Werkzeug(werkzeuge_name[i], werkzeuge_preis[i], werkzeuge_waehrung[i],
                                         haeufigkeit[i], werkzeuge_bild[i], false);
        werkzeugList.add(werkzeug);
    }


    //create an ArrayAdapter from the String Array
    dataAdapter = new MyCustomAdapter(this, R.layout.listview2_layout, werkzeugList);
    final ListView listView = (ListView) findViewById(R.id.list_View);

    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);


    // This Function doesnt work
    listView.setOnItemClickListener(

            new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    Werkzeug w = (Werkzeug)( listView.getItemAtPosition(position));

                    Toast.makeText(getBaseContext(), w.getName(), Toast.LENGTH_SHORT).show();
                }
            }
    );
}
&#13;
&#13;
&#13;

当我点击特定列表项时,没有任何反应。我不知道出了什么问题。

2 个答案:

答案 0 :(得分:1)

将此行放在listview2layout的根元素中。为我工作。

android:descendantFocusability="blocksDescendants"

答案 1 :(得分:0)

MyCustomAdapter类的内容是什么

holder.checkBox.setOnClickListener(...);

所以通过评论来尝试它,如果它有效,则添加

android:descendantFocusability="blocksDescendants" 

在自定义适配器布局文件的根视图中。

在OnItemClickListner中使用此代码

     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                MyCustomAdapter adapter = parent.getAdapter();
                Werkzeug w = (Werkzeug)( adapter.getItemAtPosition(position));

                Toast.makeText(getBaseContext(), w.getName(), Toast.LENGTH_SHORT).show();
            }