java - setOnItemClickListener 不适用于我的自定义适配器

标签 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;

        }

    }

这是 Werkzeug.java

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

这是我调用 SetOnItemClickListener() 的 OnCreate() 中的函数:

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

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

最佳答案

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

android:descendantFocusability="blocksDescendants"

关于java - setOnItemClickListener 不适用于我的自定义适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376835/

相关文章:

java - 使用 OneToMany 将对象从 JSON 保存到数据库

android - 应用内结算 : Which public and private keys are used for the in-app billing verification?

android - 为什么 Android 应用程序不从源代码编译?

android - 如何在安卓上使用第三方库?

java - 如何从firebase中child的引用中获取key

Java:新组件什么时候会显示在屏幕上?

java - 无法使用 Selenium 获取文本

android - 如何以编程方式备份​​/恢复 android 中的联系人?

java - 如何在花费几秒钟后忽略 if 语句

java - 无法解析类型 javax.ws.rs.core.MediaType