listview视图模式。删除项目时在何处设置位置。安卓

时间:2014-03-13 17:48:44

标签: android listview

我看到视图模式适合平滑滚动,但我遇到了模式错误。如果从列表视图中删除一个项目,那么标签就会有些混乱。因此,删除第二个项目不会删除用户单击的项目,但会删除上一个标记设置的项目。在下面的代码示例中,我是否已将按钮位置的标记设置为好或者是否违反了视图范例?有没有人有更好的方法去除物品?你怎么做呢?例如:

public View getView ( int position, View convertView, ViewGroup parent )
    {
        View v = convertView;
        ViewHolder holder;
        if( v == null )
        {
            LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = li.inflate(R.layout.fpc_contents_row, null);
            holder = new ViewHolder();
            holder.delete   = (Button)  v.findViewById( R.id.row_delete );
            v.findViewById( R.id.fpc_contents_row_delete ).setOnClickListener( global_onClickListener );
                    //used to set position tag here.  (deleted wrong items after the first delete)
                    //i.e)  holder.delete.setTag( position );
            v.setTag( holder );
        }
        else
            holder = (ViewHolder) v.getTag();
        //setting the tag here then delete functionality works just fine.
        holder.delete.setTag( position );
        holder.name.setText( fpcItems.get(position).item0.name );
        return v;
    }

final  OnClickListener global_onClickListener = new OnClickListener() 
    {
        public void onClick( final View view ) 
        {
            switch( view.getId() ) 
            {
            case R.id.fpc_contents_row_delete :
                int position = (Integer) view.getTag();
                arraylist.remove(position);
                notifyDataSetChanged();                                
                break;
            }
        }
    };

2 个答案:

答案 0 :(得分:1)

是的,如果您要在持有人的对象上设置标记,则需要在(v == null)条件之外进行标记。

如果不这样做,标签将仅设置在新视图上,而不是在回收视图上。例如,如果列表项三行向下使用循环视图而不是膨胀全新视图,则它将具有最初创建视图时使用的任何位置的位置标记。

您的修正是正确的:请确保在进行holder = (ViewHolder)v.getTag()来电之后拨打所有设定的方法。

答案 1 :(得分:0)

我有解决方案:

如果要从列表视图中删除行,请单击每行的DELETE按钮执行此操作。这里有一个带有名称和删除按钮的自定义适配器类的示例。每次按下该按钮都会删除该行

公共类UserCustomAdapter扩展了ArrayAdapter {

Context context;
int layoutResourceId;
ArrayList<User> data = new ArrayList<User>();

public UserCustomAdapter(Context context, int layoutResourceId,ArrayList<User> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

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


    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new UserHolder();
        holder.textName = (TextView) row.findViewById(R.id.textView1);
        holder.btnDelete = (Button) row.findViewById(R.id.button2);
        row.setTag(holder);
    } else {
        holder = (UserHolder) row.getTag();

    }

    User user = data.get(position);


    holder.btnDelete.setTag(position);
    holder.textName.setText(user.getName());



    holder.btnDelete.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            String pos = v.getTag().toString();
            int _posicion = Integer.parseInt(pos);
            data.remove(_posicion);
            notifyDataSetChanged();

        }
    });

    return row;


}

static class UserHolder {
    TextView textName;
    Button btnDelete;
}

}