2011-08-16 73 views
3

我有自定義數組適配器的列表視圖。我想從getView方法中獲取項目點擊位置。我收到了幾個列表視圖項目的位置,但是當我添加更多的7個項目到我的列表中,我從getView方法得到錯誤的位置。我的意思是,當我點擊第九屆列表項則返回1自定義適配器getView metod在ListView上的位置錯誤

這裏是我的代碼

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

     this.position = pos; 
     Log.v("View position", Integer.toString(pos)); 

     lineView = convertView; 

      if(lineView==null) 
      { 
       adapterLine=new AdapterLine(); 
       layoutInflater=context.getLayoutInflater(); 
       lineView=layoutInflater.inflate(com.inomera.sanalmarket.main.R.layout.adapter, null,true); 
       adapterLine.sListText = (TextView) lineView.findViewById(R.id.sListText); 
       adapterLine.sListCheckbox = (CheckBox) lineView.findViewById(R.id.sListCheckbox); 
       adapterLine.sListImageView = (ImageView) lineView.findViewById(R.id.imageView1); 
       adapterLine.gestureOverlayView = (GestureOverlayView) lineView.findViewById(com.inomera.sanalmarket.main.R.id.gestureOverlayView1); 
       adapterLine.gestureOverlayView.setGestureVisible(false); 

       // To remember whitch tab is selected 
       adapterLine.sListImageView.setTag(pos); 
       adapterLine.sListCheckbox.setTag(pos); 
       adapterLine.sListText.setTag(pos); 

       Log.v("adapter", "position of adapter is " + Integer.toString(pos)); 

感謝您的幫助!

回答

3

陣列適配器將只在列表視圖中爲每個可見行創建一個對象。在此之後,適配器將回收已經創建的視圖。這是的目的是:

if(lineView==null) 

行在您的適配器。

您將需要放入其他部分,使用循環視圖設置行。這另一篇文章可能會有所幫助:

How can I make my ArrayAdapter follow the ViewHolder pattern?

+0

我有寫這篇文章\t \t lineView.setTag(adapterLine); \t \t \t}否則{ \t \t \t \t adapterLine =(AdapterLine)lineView.getTag(); \t \t \t}但仍然出現同樣的問題 – cagryInside

+0

解決方案並不那麼簡單。您需要完全遵循ViewHolder模式才能完成此項工作。爲了響應您的評論,您需要在else中設置標籤,以便在用戶滾動列表時爲每行標記適當的行號。然而,我會建議遵循這個例子。 – paulb444

0

此實現不完整添加其他部,其設定從數據值。這裏是實現其工作對我來說

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder viewHolder; 
    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater inflator = reportViewContext.getLayoutInflater(); 
     convertView = inflator.inflate(R.layout.tabitems, null);    
     viewHolder.name= (TextView) convertView 
       .findViewById(R.id.user_reportTab_userName);    
     //set other values needed in viewHolder if any 
     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder)convertView.getTag(); 
    } 
    //data is list of Data model 
    if(data.size()<=0) { 
     //if data unavailable } 
    else { 

    /***** Get each Model object from Array list ********/ 
     System.out.println("Position:"+position); 

    /************ Set Model values in Holder elements ***********/ 

     viewHolder.name.setText(data.get(position).getName()); 
    }  
    return convertView; 
} 

我知道這個問題是很老了,萬一有人回答無意中發現了類似的問題

相關問題