2015-11-09 77 views
-1

我有一个自定义列表视图,其中每个项目有两个按钮(ADD & SUB)和一个textView维护计数。处理列表视图项目内的项目单击事件

最初计数为零,当我点击ADD按钮时,它加1,当我点击SUB按钮时减1。

因为对于每一行,计数应该单独维护,我没有找到任何技术可以让我做到这一点。

我尝试使用我的适配器内的View.OnClickListener,但无法检索位置。由于这一点,每当我点击添加按钮时,它会为每个项目添加1。

请帮助我一些有用的技术。

在适配器的 getView方法
+2

你的代码在哪里? – Pavan

回答

0

,只是设置点击监听器之前,你可以保留通过创建从getView与参数position初始化的最后一个变量的当前位置。然后在点击监听器中,您可以使用它。

+0

我在getView中使用了单击监听器,并调用了另一个函数,'position'作为参数传递。但问题是我如何使用持有者对象的位置来增加特定行的计数。我没有发现任何使用持有者对象的getView外部位置的函数。 – som

+0

然后通过持有人到您的功能Oo –

0

首先你必须维护一个数组,它应该根据你的加法和减法进行更新。现在,你可以把你添加和子按钮的onClick监听器在这样的适配器,

holder.plus.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       String a = holder.quantity.getText().toString(); 
       Integer qua = Integer.parseInt(a) + 1; 
       String q = qua.toString(); 
       holder.quantity.setText(q); 
       //update in database. 
       // In above comment you update the database. Now at this place you need to set the "q" to your list which you passed to adapter 
       yourList.get(position).setQuantity(q); // here you can set the updated value to your list which automatically reflect to your listview 
      } 
     }); 
0

集点击监听器,你的适配器,你必须保存按钮参考

listHolder.buttonAdd.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Do the adding task here 
    } 
}); 

它的参考对象将触发您的列表项添加按钮,而不会打扰其他人

5

首先,您必须制作ViewHolder类,它包含您的listview项目的所有TextView和Button。之后,让对象ViewHolder和持有者对象在getView中初始化所有值,如TextView和Button。通过使用这些技术值不在所有行中重复。

public class CustomAdapter extends ArrayAdapter<String>{ 
LayoutInflater vi; 
LinearLayout l; 
Activity c; 
String i[]; 
ArrayList<Integer> n; 
ViewHolder holder; 


public CustomAdapter(Activity context, String[] i) { 
    super(context,R.layout.list_item, i); 
    // TODO Auto-generated constructor stub 
    this.c = context; 
    this.i = i; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    ViewHolder holder; 
    if (convertView == null) { 
     LayoutInflater layoutInflater = c.getLayoutInflater(); 
     convertView = layoutInflater.inflate(R.layout.list_item, null); 
     holder = new ViewHolder(); 
     holder.imageview = (ImageView) convertView.findViewById(R.id.img); 
     holder.btnAdd = (Button) convertView.findViewById(R.id.inc); 
     holder.txt = (TextView) convertView.findViewById(R.id.txt); 
     holder.l = (LinearLayout) convertView.findViewById(R.id.linear); 

     holder.btnAdd.setTag(holder); 
     convertView.setTag(holder); 

     holder.btnAdd.setOnClickListener(new View.OnClickListener() { 
      int count=0; 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       View p = (View) v.getParent(); 
       ViewHolder holder1 = (ViewHolder) v.getTag(); 
       count = Integer.valueOf(holder1.txt.getText().toString()); 
       count++; 
       holder1.txt.setText(String.valueOf(count)); 



      } 
     }); 

    } 

      return convertView; 
} 

static class ViewHolder { 
    public ImageView imageview; 
    public Button btnAdd; 
    public TextView txt; 
    public LinearLayout l; 
} 
} 
+1

这是正确的方法。 setTag()效果很好 – Jas

+0

使用这种方式,它会将其他列表项的最后设置值。因为getView只会调用一次,直到您滚动视图。一旦你滚动你的视图,getView再次调用,计数器从零开始,而对于已经可见的其他项目,点击添加按钮它会从其他项目获取最后更新的值。 – som

+0

你好索姆,我已经更新了我的答案。 –