【问题标题】:Position index always return 0 in getView位置索引在 getView 中总是返回 0
【发布时间】:2013-10-16 18:10:13
【问题描述】:

我想实现一个 ListView,它在每行内都有 Delete Btn。

我唯一的问题是当我单击删除某行的 Btn 时,位置 0 的行刚刚删除!

我认为我在 getView 中的 Position 参数无法更新并且始终为 0 值

我该怎么办?!

谢谢。

import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
//import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class InvoiceListAdapter extends BaseAdapter {

  ArrayList<Object> _itemList;
  public Activity _context;
  public LayoutInflater _inflater;


  public InvoiceListAdapter(Activity context,ArrayList<Object> itemList)
  {
      super();
      this._context=context;
      this._itemList=itemList;
      this._inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

  }
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return _itemList.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return _itemList.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public static class ViewHolder
{
 TextView ProductName;
 TextView Qnt;
 TextView Price;
 Button Del;

}



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

    ViewHolder holder;
     if(convertView==null)
        {
            holder = new ViewHolder();
            convertView = _inflater.inflate(R.layout.custom_row_view, null);


            holder.ProductName = (TextView) convertView.findViewById(R.id.txt_CRow_ProdName);
            holder.Price = (TextView) convertView.findViewById(R.id.txt_CRow_Price);
            holder.Qnt = (TextView) convertView.findViewById(R.id.txt_CRow_Qnt);
            holder.Del = (Button) convertView.findViewById(R.id.btn_CRow_Delete);
            /*-----------------------------Deleting Item with Button--------------------*/
            holder.Del.setTag(holder);
            holder.Del.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(_context,"Item Deleted!", Toast.LENGTH_SHORT).show();

                    _itemList.remove(position);  
                    notifyDataSetChanged();

                    // TODO Auto-generated method stub

                }
            });

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

        AnItem Item = (AnItem) _itemList.get(position);

        holder.ProductName.setText(Item.getProductName());
        holder.Price.setText(Item.getPrice());
        holder.Qnt.setText(Item.getQnt());

        return convertView;


}

【问题讨论】:

    标签: android listview baseadapter


    【解决方案1】:

    您可能在 ScrollView 中有那个 ListView。我刚刚浪费了 2 个小时,直到我偶然发现了这个答案:

    Why is my BaseAdapter class not incrementing the position in getView?

    【讨论】:

    • 如果我没有看到你的回答,我几乎要浪费两个多小时了。谢谢。
    • 感谢您的帖子。你的时间没有浪费,它有帮助!
    • 我的情况并非如此。我在 RelativeLayout 里面只有一个 Gridview
    【解决方案2】:
     if(convertView==null)
        {
            holder = new ViewHolder();
            convertView = _inflater.inflate(R.layout.custom_row_view, null);
    
    
            holder.ProductName = (TextView) convertView.findViewById(R.id.txt_CRow_ProdName);
            holder.Price = (TextView) convertView.findViewById(R.id.txt_CRow_Price);
            holder.Qnt = (TextView) convertView.findViewById(R.id.txt_CRow_Qnt);
            holder.Del = (Button) convertView.findViewById(R.id.btn_CRow_Delete);
            /*-----------------------------Deleting Item with Button--------------------*/
            holder.Del.setTag(holder);
    
    
            convertView.setTag(holder);
        }
        else
        {
            holder=(ViewHolder)convertView.getTag();
        }
    
        AnItem Item = (AnItem) _itemList.get(position);
    
        holder.ProductName.setText(Item.getProductName());
        holder.Price.setText(Item.getPrice());
        holder.Qnt.setText(Item.getQnt());
        holder.Del.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(_context,"Item Deleted!", Toast.LENGTH_SHORT).show();
    
                    _itemList.remove(position);  
                    notifyDataSetChanged();
    
                    // TODO Auto-generated method stub
    
                }
            });
    
        return convertView;
    

    我认为 onClickListener 不在 if 块内。

    【讨论】:

    • 我认为这不是个好主意。因为 OnClickListener 类型的对象将在您滚动时创建。您应该在“if(convertView==null)”中设置所有侦听器。所以对象将被创建一次并重复使用。
    • 感谢 yasinkafadar,您的代码可以工作,但是为了提高性能,这个监听器应该在 if 条件内吗?
    • 我认为 onClickListener 不在 if 块内。-- 是道德的
    【解决方案3】:
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
    
        ViewHolder holder;
         if(convertView==null)
            {
                holder = new ViewHolder();
                convertView = _inflater.inflate(R.layout.custom_row_view, null);
    
    
                holder.ProductName = (TextView) convertView.findViewById(R.id.txt_CRow_ProdName);
                holder.Price = (TextView) convertView.findViewById(R.id.txt_CRow_Price);
                holder.Qnt = (TextView) convertView.findViewById(R.id.txt_CRow_Qnt);
                holder.Del = (Button) convertView.findViewById(R.id.btn_CRow_Delete);
                /*-----------------------------Deleting Item with Button--------------------*/
    
                holder.Del.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(_context,"Item Deleted!", Toast.LENGTH_SHORT).show();
    
                        Integer position = (Integer) v.getTag();
    
                        _itemList.remove(position.intValue());  
                        notifyDataSetChanged();
    
                        // TODO Auto-generated method stub
    
                    }
                });
    
                convertView.setTag(holder);
            }
            else
            {
                holder=(ViewHolder)convertView.getTag();
            }
    
            AnItem Item = (AnItem) _itemList.get(position);
    
            holder.ProductName.setText(Item.getProductName());
            holder.Price.setText(Item.getPrice());
            holder.Qnt.setText(Item.getQnt());
    
            holder.Del.setTag(Integer.valueOf(position));
    
            return convertView;
    
    
    }
    

    【讨论】:

    • 我试过你的代码,甚至不能删除行[0],在我的代码中至少我们可以删除行[0],但我非常感谢你的帮助:)
    • 在我的代码中,你应该调用 notifyDataSetChanged();在 element.remove(pos); 之后
    • 是的弗拉基米尔,我使用了 notifyDataSetChanged();删除更新适配器后,但没有任何反应。
    • 你知道我仍然不明白“if”条件内外究竟发生了什么。我们是否只是创建对象,直到填写 List 的视图,然后更新这些对象中的值?
    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多