在getView中,位置索引始终返回0

3
我想实现一个ListView,每一行中都有删除按钮。
唯一的问题是,当我点击某一行的删除按钮时,位置为0的行就会被删除!我认为在getView中,我的“位置”参数无法更新,始终具有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;


}
3个回答

11

1
如果我没有看到你的答案,我差点浪费了超过2个小时的时间。谢谢。 - Olkunmustafa
1
感谢您的帖子。您的时间没有浪费,它有所帮助! - SagunKho
这并不是我的情况。我只是在RelativeLayout中有一个Gridview。 - KMC

3
 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)”中设置所有监听器。这样对象只会被创建一次并被重复使用。 - Volodymyr
谢谢yasinkafadar,你的代码可行,但为了性能,这个监听器应该放在if条件语句内部吗? - Adnan
我认为onClickListener不应该在if块内。--是道德的。 - Rasel

1
@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;


}

我尝试过你的代码,但是甚至无法删除row[0]。在我的代码中,至少我们可以删除row[0],但是非常感谢你的帮助 :) - Adnan
在我的代码中,你应该在 element.remove(pos); 之后调用 notifyDataSetChanged();。 - Volodymyr
是的,弗拉基米尔,在删除后我使用了notifyDataSetChanged(); 来更新适配器,但没有任何反应。 - Adnan
你知道吗,我仍然不理解在“if”条件内外到底发生了什么。我们只是创建对象来填充列表视图,然后更新这些对象内的值吗? - Adnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接