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