【问题标题】:How do I properly remove an item from ListView in Android?如何从 Android 的 ListView 中正确删除项目?
【发布时间】:2012-03-19 16:21:33
【问题描述】:

我在从 ListView 中删除项目时遇到问题,

这是我的活动:

public class TestListItemsView1Activity extends ListActivity {
    /** Called when the activity is first created. */

    private EfficientAdapter efficientAdapter;
    private String[] data = new String[] { "BBC", "Yahoo", "CNN", "Eenadu", "Hindu" };
    private List<String> dataValues = Arrays.asList(data);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        efficientAdapter = new EfficientAdapter(this,dataValues);

        setListAdapter(efficientAdapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
        //dataValues.remove(position);
        //efficientAdapter.notifyDataSetChanged();
        Toast.makeText(this, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show();
    }
}

和适配器类:

public class EfficientAdapter extends BaseAdapter implements Filterable{

    private LayoutInflater mInflater;
    private static String TAG=EfficientAdapter.class.getSimpleName();
    private Context context;

    private HashMap<String,EfficientAdapter.ViewHolder> holders= new HashMap<String, EfficientAdapter.ViewHolder>();
    //private String[] dataArray = new String[] { "BBC", "Yahoo", "CNN", "Eenadu", "Hindu" };
    private List<String> data= new ArrayList<String>();//Arrays.asList(dataArray);

    public EfficientAdapter(Context context,List<String> data) {
        //super(context, R.layout.main, values);
        mInflater = LayoutInflater.from(context);
        this.context=context;
        this.data.addAll(data);
    }

    public EfficientAdapter(Context context) {
        //super(context, R.layout.main, values);
        mInflater = LayoutInflater.from(context);
        this.context=context;
        //data.addAll(data);
    }
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if(convertView == null){
            convertView = mInflater.inflate(R.layout.adaptor_content, null);

            holder = new ViewHolder();
            holder.textLine = (TextView) convertView.findViewById(R.id.textLine);
            holder.buttonLine =(Button) convertView.findViewById(R.id.buttonLine);

            holder.textLine.setText(this.data.get(position));
            convertView.setOnClickListener(new OnClickListener() {
                private int pos= position;
                public void onClick(View v) {
                    Toast.makeText(context, "Click-" + String.valueOf(pos), Toast.LENGTH_SHORT).show(); 

                }
            });

            holder.buttonLine.setOnClickListener(new OnClickListener() {
                private int pos= position;

                public void onClick(View v) {
                    /*ViewHolder deleteHolder = (ViewHolder)v.getTag();
                    int delPosition=deleteHolder.position;
                    holders.remove(delPosition);
                    ViewHolder currentHolder;
                    for(int i=pos+1;i<getCount();i++){
                        currentHolder = holders.get(delPosition);
                        currentHolder.position=i-1;
                    }
                    data.remove(delPosition);
                    notifyDataSetChanged();*/
                    //View convertView1 = mInflater.inflate(R.layout.adaptor_content, null);
//                  ViewHolder deleteHolder = (ViewHolder)v.getTag();

                    data.remove(getItem(pos));
                    notifyDataSetChanged();


                    //final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());


                    //ListView lv = v.findViewById(R.layout.)


                    //v.invalidate();

                    Log.i(TAG, "Delete button pressed at position" + pos);
                    Toast.makeText(context, "Delete-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();

                }
            });
            //holder.position=position;
            //holders.put(Integer.toString(position), holder);
            convertView.setTag(holder);

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

        return convertView;
    }


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

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

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


    public Filter getFilter() {
        // TODO Auto-generated method stub
        return null;
    }


    static class ViewHolder {
        TextView textLine;
        ImageView iconLine;
        Button buttonLine;
        //int position;
        }

}

每次它删除最后一个项目而不是点击的那个。

【问题讨论】:

    标签: android android-layout android-widget android-listview


    【解决方案1】:

    enter code here我认为你没有更新视图的位置。

    当您执行if (convertView == null) { inflate........} 时,您是在说第一次创建视图时,必须这样做。但是在Android中ListViews中的Views是可复用的,所以如果需要更新view的位置,就必须把这个Conditional去掉。

    尝试将 de ClickLsiteners 设置为 else 中的 if (convertView = null)...。 试试看……然后告诉我

    public class EfficientAdapter extends BaseAdapter implements Filterable{
    
    private LayoutInflater mInflater;
    private static String TAG=EfficientAdapter.class.getSimpleName();
    private Context context;
    
    //private String[] dataArray = new String[] { "BBC", "Yahoo", "CNN", "Eenadu", "Hindu" };
    private List<String> data= new ArrayList<String>();
    
    public EfficientAdapter(Context context,List<String> data) {
        super();
        mInflater = LayoutInflater.from(context);
        this.context=context;
        this.data.addAll(data);
    }
    
    public EfficientAdapter(Context context) {
        super();
        mInflater = LayoutInflater.from(context);
        this.context=context;
    }
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
    
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.adaptor_content, null);
            holder = new ViewHolder();
            holder.textLine = (TextView) convertView.findViewById(R.id.textLine);
            holder.buttonLine =(Button) convertView.findViewById(R.id.buttonLine);
            convertView.setTag(holder);
    
        }
        holder =(ViewHolder) convertView.getTag();
        holder.textLine.setText(getItem(position));
        convertView.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(context, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show(); 
    
            }
        });
        holder.buttonLine.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                data.remove(position);
                notifyDataSetChanged();
                Log.i(TAG, "Delete button pressed at position" + position);
                Toast.makeText(context, "Delete-" + String.valueOf(position), Toast.LENGTH_SHORT).show();
            }
        });
    
        return convertView;
    }
    
    
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }
    
    public String getItem(int position) {
        // TODO Auto-generated method stub
        return data.get(position);
    }
    
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    
    static class ViewHolder {
        TextView textLine;
        ImageView iconLine;
        Button buttonLine;
        //int position;
    }
    
    @Override
    public android.widget.Filter getFilter() {
        return null;
    }
    

    }

    正在工作!测试一下:)

    【讨论】:

    • 已移至其他条件但仍然相同
    • 如何在 Activity 上添加一个 OnClickItemListener 然后调用adapter.remove(int position)。您必须在适配器中将此方法创建为公共并执行data.remove(position)。那怎么办?
    • 谢谢你。它的工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多