0

POJO クラスを使用して設定された ArrayAdapter があります。リストビューは 2 つのレイアウトで構成されています。1 つはメニュー項目用で、もう 1 つはカテゴリ用です。区切り記号付きのリストビューは問題ありません。

後で、メニューアイテムの各行にボタンを追加して、その詳細を編集しようとしました。ここで、ボタンがクリックされた行の位置を取得しようとしたときに問題が発生しました。

ログを使って位置を表示してみました。1. 行数が少なく、スクロールする必要がない場合。ログは正しい位置を示しています。2. ページに実行される行がさらにある場合、ログ内の位置が正しくありません。

コードの修正が必要な行を教えていただけますか? 前もって感謝します

public class ConfirmAdapter  extends ArrayAdapter<POJO_ConfirmMenu> {
    private ArrayList<POJO_ConfirmMenu> ticketItem;  
    Context context;
    LayoutInflater vi; 
    public ConfirmAdapter(Context context ,ArrayList<POJO_ConfirmMenu> menu) {    
        super(context, 0, menu ); 
        this.ticketItem = new ArrayList<POJO_ConfirmMenu>();    
        this.ticketItem.addAll(menu); 
        this.context =context;
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
        }     
    private class ViewHolder {
        TextView ticketItem;   
        TextView type;  
        TextView quantity;  
        Button cancel,edit; 
        } 
    public boolean isEnabled(int position) { 
        if (ticketItem.get(position).getItemType().equals("menucategory")) 
            return false;
            return true;
    } 
    public int getItemViewType(int position) {
        if (ticketItem.get(position).getItemType().equals("menucategory")) 
            return 0;
            return 1;
    } 
    public int getViewTypeCount() {
        return 2;
    } 
    public View getView(final int position, View convertView, ViewGroup parent) {      
        ViewHolder holder;   
        int type = getItemViewType(position);  
        if (convertView == null) { 
            holder = new ViewHolder();  
            switch (type) {
            case 0:
                convertView = vi.inflate(R.layout.group,  null); 
                holder.ticketItem = (TextView) convertView.findViewById(R.id.tvGroup);
                convertView.setBackgroundColor(Color.RED); 
                break;              
            case 1:
                convertView = vi.inflate(R.layout.confirmitem,  null); 
                holder.ticketItem = (TextView) convertView.findViewById(R.id.tvConfirmItem); 
                holder.quantity  = (TextView) convertView.findViewById(R.id.tvQuantity); 
                holder.cancel    = (Button)   convertView.findViewById(R.id.bCancel); 
                holder.edit      = (Button)   convertView.findViewById(R.id.bEdit);   
                                 holder.edit.setTag(position);  
                //   Edit button
                holder.edit.setOnClickListener(new View.OnClickListener() {  
                    public void onClick(View v) {   
                        int pos = (Integer) v.getTag();

                        Log.i("ConfirmAdapter ","Order       Edit @ position : " + pos); 
                        }       
                });   
                break; 
             }              convertView.setTag(holder); 
        } else {
            holder = (ViewHolder) convertView.getTag();  
        }     
        switch (type) {
        case 0:         
            holder.ticketItem.setText(ticketItem.get(position).getTicketItemObject().getCategoryName()) ; 
            convertView.setBackgroundColor(Color.RED);  
            break;              
        case 1:
            holder.ticketItem.setText(ticketItem.get(position).getTicketItemObject().getName());
            holder.quantity.setText(Integer.toString(ticketItem.get(position).getTicketItemObject().getItemCount())); 
            break; 
         } 
        return convertView; 
        } 
}  

}

4

1 に答える 1

4

メソッド内でgetView()ボタンにタグを設定する必要があり、ボタンをクリックすると整数内のタグを取得すると、ボタンクリックの正しい位置が次のように返されます。

else {
        holder = (ViewHolder) convertView.getTag();  
}   
holder.edit.setTag(position);  //to get the orignal position later in onClick() of button
holder.edit.setOnClickListener(new View.OnClickListener() {  
          public void onClick(View v) {   
                 int pos = (Integer) v.getTag();  //the real and updated position
             Log.i("ConfirmAdapter ","Order Edit @ position : " + pos); 
          }       
});  

更新しました

注: convert-view タグを取得したら、タグをボタンに設定し、クリックも処理します。

ビューの setTag() getTag() メソッドの主な目的は何ですか?

于 2013-01-04T09:27:48.493 に答える