自定义NumberPicker buttons.onClickListener

时间:2013-08-09 07:04:27

标签: android numberpicker

我的一项活动需要一个列表视图,每行包含自定义数字选择器。 我根据建议here创建了数字选择器。但是,当我点击按钮时,计数器根本不会增加或减少。

以下是我的自定义ListView适配器上的代码。

public class MaterialListViewAdapter extends BaseAdapter 
{
    ViewHolder holder;
    int counter = 0;

    private ArrayList<MaterialClass> data;

    public static LayoutInflater inflater = null;

    public static Dialog dialog;
    String materialName;

    public MaterialListViewAdapter(Context applicationContext,
       int materialdialogcontent, ArrayList<MaterialClass> materials) 
    {
       this.data = materials;
        inflater = (LayoutInflater)applicationContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() 
    {
        return data.size();
    }

    @Override
    public Object getItem(int position) 
    {
        return position;
    }

    @Override
    public long getItemId(int position) 
    {
        return position;
   }

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

        View vi = convertView;

        //ViewHolder holder = new ViewHolder();

        if(vi == null)
        {
            holder = new ViewHolder();

            vi = inflater.inflate(R.layout.materialdialogcontent, null);

            //Initialize Buttons and TextViews.

            holder.num.setText("0");

            holder.add.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v) 
                {
                    counter++;
                    holder.num.setText("" + counter);
                }
            });

            holder.sub.setOnClickListener(new View.OnClickListener()
            {   
                @Override
                public void onClick(View v) 
                {
                    counter--;
                    holder.sub.setText("" + counter);
                }
            });


            //holder.pk = (NumberPicker)vi.findViewById(R.id.npMaterialAmount);

            vi.setTag(holder);
        }
        else
        {
        holder = (ViewHolder)vi.getTag();
        }

        holder.txt.setText(data.get(position).getName());
        //holder.pk.setMaxValue(20);
        //holder.pk.setMinValue(0);

        return vi;
    }

    private class ViewHolder
    {
        TextView txt;
        Button add;
        Button sub;
        TextView num;
        //NumberPicker pk;
    }

}

当我尝试调试以查看正在发生的事情时,计数器甚至不会使用“0”进行初始化。

我尝试在getView()方法中初始化计数器,但为了做到这一点,我需要将计数器设置为final,然后出现另一个错误

The final local variable counter cannot be assigned, since it is defined in an enclosing type.

有什么建议吗?

更新了其他代码:

public class Material extends Activity 
    {
    ArrayList<String> materialList;
    ListView lv;
    Button btnConfirm;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_material);

        lv = (ListView)findViewById(R.id.list);
        btnConfirm = (Button)findViewById(R.id.btnConfirm);

        materialList = new ArrayList<String>();
        Intent i = getIntent();

        materialList = i.getStringArrayListExtra("materialList");

        if(materialList != null)
        {
            Toast t = Toast.makeText(getApplicationContext(), materialList.get(0).toString(), Toast.LENGTH_LONG);
            t.show();
        }
        else
        {
            //FILL HERE LATER
        }

        ArrayList<MaterialClass> materials = new ArrayList<MaterialClass>();
        for(String temp : materialList)
        {
            MaterialClass m = new MaterialClass();
            m.setName(temp);
            materials.add(m);
        }

        MaterialListViewAdapter adapter = new MaterialListViewAdapter(getApplicationContext(), R.layout.materialdialogcontent, materials);
        lv.setAdapter(adapter);
    }

}

2 个答案:

答案 0 :(得分:0)

试试这个:

public class MaterialListViewAdapter extends BaseAdapter 
{
    ViewHolder holder;
    int counter = 0;

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

        View vi = convertView;

        //ViewHolder holder = new ViewHolder();

        if(vi == null)
        {
            holder = new ViewHolder();

            vi = inflater.inflate(R.layout.materialdialogcontent, null);

            //Initialize Buttons and TextViews.
            //holder.pk = (NumberPicker)vi.findViewById(R.id.npMaterialAmount);

            vi.setTag(holder);
        }
        else
        {
            holder = (ViewHolder)vi.getTag();
        }

        holder.txt.setText(data.get(position).getName());
        //holder.pk.setMaxValue(20);
        //holder.pk.setMinValue(0);

        holder.add.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                counter++;
                holder.num.setText("" + counter);
            }
        });

        holder.sub.setOnClickListener(new View.OnClickListener()
        {   
            @Override
            public void onClick(View v) 
            {
                counter--;
                holder.num.setText("" + counter);
            }
        });

        return vi;
    }

    private class ViewHolder
    {
        TextView txt;
        Button add;
        Button sub;
        TextView num;
        //NumberPicker pk;
    }

}

答案 1 :(得分:0)

您应该为onItemClickListener实施listView。您正在使用适配器类中的侦听器,但实际上这些数字只是该listView的项目,因此要操作那些您没有在onItemClickListener上定义的按钮(listView的项目)。所以在设置适配器写入

之后
lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> listView, View item, int position, long id) {

         // here you are getting position of clicked item
        }      
}

<强>更新

我再次浏览了你的代码,我发现了这些:

1.你正在写这一行:

MaterialListViewAdapter adapter = new MaterialListViewAdapter(getApplicationContext(), R.layout.materialdialogcontent, materials);

但是我没有在你的适配器中看到任何构造函数。

2.在扩展BaseAdapter时,您必须覆盖getCount()getItem(int position)getItemId(int position)方法,如getView()。你有问题。