0

List.get(position)の位置を取得するために使用していListViewます。ただし、これは現在のスクロール境界の上からの位置を返します。私の ListView には 50 個の項目がありますが、一度に 10 個しか表示できません。したがって、完全に下にスクロールして List.get(position) を呼び出すと、リスト項目に対して 50 ではなく 10 が取得されます。項目のちょうど真ん中にある項目をクリックするListViewと、25 ではなく 5 が取得されます。

の実際の上部ListViewからの位置を取得するにはどうすればよいですか。少なくとも最も簡単な方法。ListView

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;

if (convertView == null) {
  LayoutInflater inflator = context.getLayoutInflater();      
  view = inflator.inflate(R.layout.addtowatchlist, null);
  final ViewHolder viewHolder = new ViewHolder();
  viewHolder.text = (TextView) view.findViewById(R.id.label);      
  viewHolder.addbutton = (Button) view.findViewById(R.id.button);
  viewHolder.addbutton
      .setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View buttonview) {
            //I need the correct ACTUAL position here, not the VISABLE position                 
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(list.get(position).getUrl()));
            context.startActivity(browserIntent);              
            list.get(position).getUrl();                
            Model element = (Model) viewHolder.addbutton
                      .getTag();
                  element.setSelected(true);
        }
      });
  view.setTag(viewHolder);
  viewHolder.addbutton.setTag(list.get(position));
} else {
  view = convertView;
  ((ViewHolder) view.getTag()).addbutton.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());      
return view;

}

編集:間違ったviewHolderでonClickListenerを呼び出すことに関係があると思いますが、よくわかりません...

4

2 に答える 2

1

変数positionはすでにListView内のエントリの位置です。
あなたのリストに何が入っているのかわかりません。
BaseAdapterがどのように機能し、getViewを正しく構築するかについてのチュートリアルは次のとおりです。http://thinkandroid.wordpress.com/2010/01/13/custom-baseadapters/

于 2013-02-28T13:21:23.850 に答える
0

何度も苦労した後、自分で修正しました。ListView の最適化がどのように機能し、convertViewパラメーターが何をするのかを理解していませんでした...

onClickListenerブロックの外側に移動し、if (convertView == null)getView がビューを返す直前に配置しました。このように取得される場所は、リサイクルされた可視場所ではなく、上からずっと実際の場所です。

@Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    View view = null;
    final AiringModel am = list.get(position);      
    am.setRealPosition(position, list.get(position).getUrl());    
    LayoutInflater inflator = context.getLayoutInflater();      
    view = inflator.inflate(R.layout.addtowatchlist, null);
    final ViewHolder viewHolder = new ViewHolder();
    viewHolder.text = (TextView) view.findViewById(R.id.label);
    if (convertView == null) {
        view.setTag(viewHolder);     
    } else {
      view = convertView;
      ((ViewHolder)view.getTag()).addbutton.setTag(list.get(position));      
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());       
    viewHolder.addbutton = (Button) view.findViewById(R.id.check);    
    viewHolder.addbutton.setTag((Integer)position);    
    viewHolder.addbutton
    .setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View buttonview) {
            // TODO Auto-generated method stub                  
            int realPosition = am.getRealPosition();
            String realName = am.getRealName();
            Log.d("Pair created!", "Clicked button with position: "+ realPosition + " For item name: " + realName);
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(list.get(realPosition).getUrl()));
            context.startActivity(browserIntent);           
        }
    });
    return view;
  }
于 2013-02-28T17:09:44.640 に答える