2012-02-28 97 views
-1

在我的listview的getview中,我将位置分配给另一个变量。 我在listrow中有一个复选框。android listview获取视图的位置

我已经为复选框定义了setOnCheckedChangeListener。

现在,当我检查/取消选中行时,我发现getview没有被调用。 但我使用在getview中设置的位置值,它给了我正确的值。

即如果我单击第10个位置,该变量也有10个。

请解释我是如何工作的。

我的代码如下

public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     final int pos = position; 
     barcodeForSelectedRow = productList.get(pos).getBarcode(); 
     formatForSelectedRow = productList.get(pos).getFormat(); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.product_list_row, null); 

      holder = new ViewHolder(); 
      holder.text1 = (TextView) convertView.findViewById(R.id.productid); 

      holder.text2 = (TextView) convertView.findViewById(R.id.price); 
      holder.text2.setOnClickListener(listener); 
      holder.image = (ImageView) convertView 
        .findViewById(R.id.productimageid); 
      holder.check=(CheckBox) convertView.findViewById(R.id.checkbox); 
      convertView.setTag(holder); 
      holder.image.setOnClickListener(listener); 

    } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 


     // setWishListItemsInScanList(pos, convertView); 
     holder.check.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      public void onCheckedChanged(CompoundButton checkBox, 
        boolean isChecked) { 
       Log.i("CheckBox check", "" + pos); 


     }); 
     return convertView; 
    } 

我在这里设置getview 内POS =位置,当我点击第10行的复选框,则oncheckchnaged听众是越来越调用,但不是getview功能 但我看到它在onchechchangedlistener中位置正确。 我想知道它是如何发生的

NB:当我来到这个活动,这是预期的行为时,调用getview也当我点击复选框getview不应该被称为,它也工作正常。我的问题是如何oncheckchangedlistener获取位置值正确

+0

您应该提取相关部分,而不是发布所有此代码。在这个过程中,你可能会发现解决方案... – Kheldar 2012-02-28 10:46:55

+0

你的意思是,你的控件不会进入复选框的onCheckedChange()? – Hiral 2012-02-28 10:47:25

+1

onCheckedChanged当您更改复选框的状态时,将调用此函数。不是你的getView方法 – Triode 2012-02-28 10:51:55

回答

1

为每个特定视图调用getView(),因此每次设置setOnCheckedChangeListener()时,都会传递本地值“pos”。每次调用getview()时,都会创建一个新变量“pos”,并且由于您将其设置为final,因此无法以其他方式进行设置。所以每个setOnCheckedChangeListener()都有它自己的“pos”变量实例。

+0

是的,这回答了我的问题。非常感谢。 – png 2012-02-28 11:33:41

2

你是什么意思getview没有被调用?使用getview中的位置时要小心。如果你滚动的位置将被回收,以及如果你onresume。

编辑 您的评论的简短回答将是list.getPositionInView(View view);

+0

我不认为该位置被回收,转换视图将被回收的每个视图组。但是位置不会在滚动上发生变化,因为通常位置用于从数组array/list中获取内容 – png 2012-02-28 10:56:13

+0

您的意思是说您的getview函数没有被调用?如果它没有被调用,甚至不应该加载该活动,那么最多只会得到一个空的活动。如果您的视图不可滚动,则在位置活动正确的情况下不会有问题。如果是这种情况,请暂停活动(打回家),然后从您的图标返回活动并检查您的位置。你可能会发现你的位置是相反的,或者你只有一半的位置,每一个被调用两次。 getpositioninview()会给你更多的可靠性。 – maebe 2012-02-28 11:05:08

+0

getview被调用,每当我来到这个活动,这是预期的行为,当我点击一个复选框getview不应该被称为,并且它也工作正常。我的问题是,oncheckchangedlistener如何正确获取位置值。也是我的观点滚动 – png 2012-02-28 11:08:10