我发现 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;
}
}
};
最佳答案
是的,如果您要在容器中的对象上设置标签,您需要在 (v == null)
条件之外进行。
如果不这样做,标签将只设置在新 View 上,而不会设置在回收 View 上。例如,如果向下三行的列表项使用回收 View 而不是扩充全新 View ,它将具有最初创建 View 时使用的任何位置的位置标签。
您的修复是正确的:确保在执行 holder = (ViewHolder)v.getTag()
调用后调用所有设置方法。
关于android - ListView 查看器模式。在哪里设置删除项目的位置标签。安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386838/