【问题标题】:Custom NumberPicker buttons.onClickListener自定义 NumberPicker 按钮.onClickListener
【发布时间】:2013-08-11 02:05:06
【问题描述】:

我的一项活动需要一个列表视图,每行包含自定义数字选择器。 我按照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);
    }

}

【问题讨论】:

  • 您是否为您的 ListView 定义了 onItemClickListener?如果是,则不会触发您对按钮的点击。
  • @Santhosh 不,我还没有定义它。应该按原样工作,但事实并非如此。
  • @Santhosh 编辑了帖子。这是我处理ListView 的活动。

标签: android numberpicker


【解决方案1】:

试试这个:

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

}

【讨论】:

    【解决方案2】:

    您应该为您的 listView 实现 onItemClickListener 。您在适配器类中使用侦听器,但实际上这些数字只不过是该 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 时,必须像 getView() 一样覆盖 getCount()getItem(int position)getItemId(int position) 方法。你遇到了问题。

    【讨论】:

    • @giga_abih 我不需要获取项目的位置,也不需要点击列表项。我只需要单击列表视图中的一个按钮。我还需要按照你的建议做吗?
    • 这就是我的意思,列表视图中的按钮什么都不是,但它们是该列表视图的项目。现在点击那个项目,你应该实现它的监听器。还要确保您使用的按钮是可点击的。在按钮元素内的 XML 中放入 android:clickable="true"
    • @ClaireG 你在你的列表中有什么看法吗?这是因为您已将数据添加到适配器中,并将该适配器设置为 listView。您还为 listView 实现了onItemClickListener。但是适配器的notifyDatasetChanged() 方法在哪里?在lv.setOnItemClickListener 之后写adapter.notifyDataSetChanged();。这样数据就会反映到 listView 中。如果问题仍然存在,请告诉我们。
    • 感谢您的建议@giga_abhi。不,我没有在列表中获得任何视图。我也尝试了adapter.notifyDataSetChanged();,但仍然没有任何反应。我知道 ids 和 Adapter 类的传递有问题,但无法找出它是什么。当我在适配器类中有 onClickListeners 时,计数器正确递增,并且调试器变量指示 TextView 的文本设置为“1”(例如),但该数字实际上并未显示在 textview 中。
    • 另外,作为旁注,当我在列表视图单击侦听器处断点代码时,当我单击列表视图时它不会停在那里。那是不是说明那里的代码没用了?
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2013-09-30
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多