Android listview视图夹模式。在何处设置移除项目时的位置标签。安卓

Android listview视图夹模式。在何处设置移除项目时的位置标签。安卓,android,listview,Android,Listview,我发现viewholder模式有利于平滑滚动,但是我遇到了一个错误。如果从listview中删除一个项目,那么标记就会有点混乱。因此,删除第二个项目不会删除用户单击的项目,而是删除上一个标记设置的项目。在下面的代码示例中,我是在哪里为按钮的位置设置了标记,好的,还是它打破了viewholder范例?有人有更好的方法移除物品吗?你是怎么做到的?例如: public View getView ( int position, View convertView, ViewGroup parent )

我发现viewholder模式有利于平滑滚动,但是我遇到了一个错误。如果从listview中删除一个项目,那么标记就会有点混乱。因此,删除第二个项目不会删除用户单击的项目,而是删除上一个标记设置的项目。在下面的代码示例中,我是在哪里为按钮的位置设置了标记,好的,还是它打破了viewholder范例?有人有更好的方法移除物品吗?你是怎么做到的?例如:

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;
            }
        }
    };

是的,如果要在holder中的对象上设置标记,则需要在
(v==null)
条件之外进行设置

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

您的修复方法是正确的:确保在执行
holder=(ViewHolder)v.getTag()调用后调用所有set方法。

我有解决方案:

如果要从列表视图中删除某一行,请单击该行的“删除”按钮。这里有一个带有名称和删除按钮的自定义适配器类的示例。每次按下按钮,该行将被删除

公共类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;
}
语境;
国际布局资源;
ArrayList数据=新的ArrayList();
public UserCustomAdapter(上下文上下文、int-layoutResourceId、ArrayList数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行=转换视图;
UserHolder=null;
if(行==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新用户holder();
holder.textName=(TextView)row.findViewById(R.id.textView1);
holder.btnDelete=(按钮)行.findViewById(R.id.button2);
row.setTag(支架);
}否则{
holder=(UserHolder)row.getTag();
}
User=data.get(位置);
holder.btnDelete.setTag(位置);
holder.textName.setText(user.getName());
holder.btnDelete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串pos=v.getTag().toString();
int _posicion=Integer.parseInt(pos);
数据删除(_posision);
notifyDataSetChanged();
}
});
返回行;
}
静态类用户持有者{
文本视图文本名称;
按钮btnDelete;
}
}