2011-08-16 15 views
3

私はカスタムアレイアダプタでリストビューを持っています。 getViewメソッドから項目をクリックしたいのですが。私はいくつかのリストビューアイテムの位置を取得していますが、私は私のリストに7つ以上の項目を追加するとき、私はgetViewメソッドから間違った位置を取得します。私は第九リスト項目をクリックしたとき、それはここでは1カスタムビューアがListViewのgetView metodで間違った位置に表示される

を返す意味することは、私のコードは、任意のヘルプ

@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

アレイアダプタは、リストビューの表示行ごとに1つのオブジェクトのみを作成します。その後、アダプタは既に作成されたビューをリサイクルします。これは、次の目的のためです。

if(lineView==null) 

ラインをアダプタに入れます。

リサイクルされたビューを使用して行を設定するelseセクションを配置します。この他の記事では、役に立つかもしれ:

How can I make my ArrayAdapter follow the ViewHolder pattern?

+0

をつまずいた場合には答えています。 \t \t \t}他{ \t \t \t \t adapterLine =(AdapterLine)lineView.getTag(); \t \t \tでも同じ問題が発生する – cagryInside

+0

解決策はそれほど簡単ではありません。この作業を行うには、ViewHolderパターンに完全に従う必要があります。あなたのコメントに応じて、ユーザーがリストをスクロールするたびに、各行に適切な行番号がタグ付けされるように、elseにsetTagを設定する必要があります。しかし、この例に従うことをお勧めします。 – 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; 
} 

を働いた実装では、誰もが私はこの\t \t lineView.setTag(adapterLineを)書きしている同様の問題に