【问题标题】:android-Button's clickevent of listView using BaseAdapter使用BaseAdapter的listView的android-Button点击事件
【发布时间】:2012-10-26 05:28:34
【问题描述】:

我正在使用 Listview 与包含 imageview、textview 和 3 个按钮(插入、更新、删除)的自定义适配器要求是每次在 BROADCAST 接收器中调用自定义适配器,直到 intentfilter 匹配,我也在基础适配器的getView方法中设置按钮的onclicklistener。

问题是只有最后一行的listview按钮只能点击。但我希望所有行的所有按钮都必须点击。

谁能给我建议或任何想法我可以如何解决这个问题。

public View getView(final int position, View view, ViewGroup parent) {
    // TODO Auto-generated method stub

            pos=position;

    if(view==null)
    {
        LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view=inflater.inflate(R.layout.device_name, parent, false);
    }

    TextView text_view=(TextView)view.findViewById(R.id.textview_deviceName);

    ImageView image_view=(ImageView)view.findViewById(R.id.imageView1);

    text_view.setText(strDeviceName[position]);
    if(strMajorDevice[position].equalsIgnoreCase("phone"))
    {
        image_view.setImageResource(int_image[0]);
    }
    else
    {
        image_view.setImageResource(int_image[1]);
    }
    btnAdd=(Button)view.findViewById(R.id.btn_add);
    btnUpdate=(Button)view.findViewById(R.id.btn_update);
    btnDelete=(Button)view.findViewById(R.id.btn_delete);

    btnAdd.setOnClickListener(this);
    btnUpdate.setOnClickListener(this);
    btnDelete.setOnClickListener(this);
    return view;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v==btnAdd)
    {
        Toast.makeText(context, "ADD", Toast.LENGTH_LONG).show();
        Intent intent = new Intent(context,MaterDeviceFormActivity.class);
        intent.putExtra("button","add");
        intent.putExtra("device_address", strDviceAddess[pos]);
        context.startActivity(intent);

    }
    else if(v==btnUpdate)
    {
        Toast.makeText(context, "UPDATE", Toast.LENGTH_LONG).show();
        Intent intent = new Intent(context,MaterDeviceFormActivity.class);
        intent.putExtra("button","update");
        intent.putExtra("device_address", strDviceAddess[pos]);
        context.startActivity(intent);
    }
    else if(v==btnDelete)
    {
        Toast.makeText(context, "DELETE", Toast.LENGTH_LONG).show();
        Intent intent = new Intent(context,MaterDeviceFormActivity.class);
        intent.putExtra("button","delete");
        intent.putExtra("device_address", strDviceAddess[pos]);
        context.startActivity(intent);
    }
}

【问题讨论】:

  • 请放一些getview方法的代码,以便我们为您提供帮助。
  • 看..这是我的获取视图方法..我尝试了所有的建议..bt 没有希望的结果..

标签: java android


【解决方案1】:
private Context context;

public ListViewAdapter(Context context, String[] dateValues,String[] creditAmountValues,String[] closingBalanceValues,String[] currentAmountValues) 
{
    super(context, R.layout.transactionlayout, dateValues);
    this.context = context;

}

 @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.transactionlayout, parent, false);


         ((Button)rowView.findViewById(R.id.transactions_historyButtonID)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(context, ""+position, 4000).show();
        }
    });

    return rowView;
  }

使用inflater 来使用行视图。这是有效的。如果您有任何疑问,请告诉我。

【讨论】:

    【解决方案2】:

    通过setTag()为get view方法中的每个view设置tag

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
    
            if (convertView == null) {                            
                LayoutInflater inflater = context.getLayoutInflater();
                convertView = inflater.inflate(.....);
            } 
    
            ur_view= (views) convertView.findViewById(R.id.....);
                    ur_view.setTag(position);
    
            ur_view.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    //do something
                }
            }); 
    

    会有用的

    【讨论】:

    • in setTag int is not allowed..它只考虑了 Object 或 (int,Object) 请描述你的建议我实际上无法得到它..
    • 是的,我明白了..谢谢..我的错误是我在 setOnClickLictener 中传递了“this”并实现了类..
    【解决方案3】:

    - 认为您没有使用OnClickListener 接口注册所有Buttons

    【讨论】:

      【解决方案4】:

      试试这个,也许它会解决你的问题。

      btnAdd.setOnClickListener(new OnClickListener() {
      
          @Override
          public void onClick(View arg0) {
              // TODO Auto-generated method stub
              Integer index = (Integer) arg0.getTag();
      
              Toast.makeText(context, "ADD", Toast.LENGTH_LONG).show();
              Intent intent = new Intent(context,MaterDeviceFormActivity.class);
              intent.putExtra("button","add");
              intent.putExtra("device_address", strDviceAddess[index]);
              context.startActivity(intent);
          }
      });
      
      btnUpdate.setOnClickListener(new OnClickListener() {
      
          @Override
          public void onClick(View arg0) {
              // TODO Auto-generated method stub
              Integer index = (Integer) arg0.getTag();
      
              Toast.makeText(context, "UPDATE", Toast.LENGTH_LONG).show();
              Intent intent = new Intent(context,MaterDeviceFormActivity.class);
              intent.putExtra("button","update");
              intent.putExtra("device_address", strDviceAddess[index]);
              context.startActivity(intent);
          }
      });
      
      btnDelete.setOnClickListener(new OnClickListener() {
      
          @Override
          public void onClick(View arg0) {
              // TODO Auto-generated method stub
              Integer index = (Integer) arg0.getTag();
      
              Toast.makeText(context, "DELETE", Toast.LENGTH_LONG).show();
              Intent intent = new Intent(context,MaterDeviceFormActivity.class);
              intent.putExtra("button","delete");
              intent.putExtra("device_address", strDviceAddess[index]);
              context.startActivity(intent);
          }
      });
      

      【讨论】:

      • @yogeshkapuriya 如果这个答案对您有帮助,请接受。
      【解决方案5】:

      您可以使用适配器内的按钮侦听器,但唯一注册它的项目将是最后绘制的项目(即立即从列表中删除的项目)。您需要告诉按钮侦听器它被点击了哪个项目。在我的例子中,我只是传入了位置,并使用它来加载操作列表项所需的任何相关信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多