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