Android 从自定义ListView中删除行

Android 从自定义ListView中删除行,android,listview,adapter,Android,Listview,Adapter,好的,所以我已经搜索了一段时间,但似乎找不到工作的答案。这一个很接近,但它删除了列表中的最后一项,然后在我删除最后一个值时崩溃。我只想让列表行内部的一个按钮根据列表中的内容执行一个操作,然后从列表中删除该行。谢谢大家! public class CitrusListAdapter extends ArrayAdapter<CitrusList> { //Globals Context context; int layoutResourceId; ArrayList<Citru

好的,所以我已经搜索了一段时间,但似乎找不到工作的答案。这一个很接近,但它删除了列表中的最后一项,然后在我删除最后一个值时崩溃。我只想让列表行内部的一个按钮根据列表中的内容执行一个操作,然后从列表中删除该行。谢谢大家!

public class CitrusListAdapter extends ArrayAdapter<CitrusList>
{

//Globals
Context context;
int layoutResourceId;
ArrayList<CitrusList> data = null;

//Create the list item row
public CitrusListAdapter(Context context, int layoutResourceId, ArrayList<CitrusList> listItems)
{
    super(context, layoutResourceId, listItems);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = listItems;
}

//Expand and place items for List View onto calling page in ListView
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    View row = convertView;
    CitrusListHolder holder = null;

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

        //holder.txtTitle = (TextView)row.findViewById(R.id.CitrusListTitle);
        holder.colorSpinner = (Spinner)row.findViewById(R.id.color_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getContext(),
                R.array.colors_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.colorSpinner.setAdapter(adapter);

        holder.textureSpinner = (Spinner)row.findViewById(R.id.texture_spinner);
        ArrayAdapter<CharSequence> texture_adapter = ArrayAdapter.createFromResource(getContext(),
                R.array.texture_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.textureSpinner.setAdapter(texture_adapter);

        holder.soliditySpinner = (Spinner)row.findViewById(R.id.solidity_spinner);
        ArrayAdapter<CharSequence> solidity_adapter = ArrayAdapter.createFromResource(getContext(),
                R.array.solidity_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.soliditySpinner.setAdapter(solidity_adapter);

        Button rateButton = (Button) row.findViewById(R.id.rate_button);
        rateButton.setTag(position);
        rateButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Integer index = (Integer) v.getTag();
                data.remove(index.intValue());
                notifyDataSetChanged();
            }
        });

        row.setTag(holder);
    }
    else
    {
        holder = (CitrusListHolder)row.getTag();
    }

    CitrusList SingleLine = data.get(position);
    //holder.txtTitle.setText(SingleLine.title);
    return row;
}

//Stores the values of the items in the list view
static class CitrusListHolder
{
    //TextView txtTitle;
    Spinner colorSpinner;
    Spinner textureSpinner;
    Spinner soliditySpinner;
}
}
公共类CitrusListAdapter扩展了ArrayAdapter
{
//全球的
语境;
国际布局资源;
ArrayList数据=null;
//创建列表项行
公共CitrusListAdapter(上下文上下文、int-layoutResourceId、ArrayList listItems)
{
超级(上下文、布局资源ID、列表项);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
this.data=列表项;
}
//展开列表视图的项目并将其放置到ListView中的调用页上
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
CitrusListHolder=null;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新的CitrusListHolder();
//holder.txtTitle=(TextView)row.findViewById(R.id.CitrusListTitle);
holder.colorSpinner=(Spinner)row.findViewById(R.id.color\u Spinner);
ArrayAdapter=ArrayAdapter.createFromResource(getContext(),
R.array.colors\u数组,android.R.layout.simple\u微调器\u项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
支架.彩色微调器.设置适配器(适配器);
holder.textureSpinner=(微调器)row.findViewById(R.id.texture\u微调器);
ArrayAdapter纹理_adapter=ArrayAdapter.createFromResource(getContext(),
R.array.texture\u数组,android.R.layout.simple\u微调器\u项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
holder.TextureSpiner.setAdapter(纹理适配器);
holder.soliditySpinner=(Spinner)行.findViewById(R.id.solidity\u Spinner);
ArrayAdapter solidity_adapter=ArrayAdapter.createFromResource(getContext(),
R.array.solidity\u数组,android.R.layout.simple\u微调器\u项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
固定器.坚固旋扣器.固定接头(坚固接头);
按钮速率按钮=(按钮)行。findViewById(R.id.rate_按钮);
rateButton.setTag(位置);
rateButton.setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
整数索引=(整数)v.getTag();
data.remove(index.intValue());
notifyDataSetChanged();
}
});
row.setTag(支架);
}
其他的
{
holder=(CitrusListHolder)行。getTag();
}
CitrusList单线=data.get(位置);
//holder.txtTitle.setText(单线.title);
返回行;
}
//在列表视图中存储项目的值
静态类CitrusListHolder
{
//TextView-txtTitle;
纺纱机颜色纺纱机;
纺纱机;
旋转器;旋转器;旋转器;
}
}

我想你应该试试这个

rateButton.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            int index = Integer.parseInt(v.getTag().toString())
            data.remove(index);
            notifyDataSetChanged();
        }
    });

您可以使用
remove()
方法从数组列表中删除该项,然后调用适配器的
notifyDataSetChanged()
方法。

要从列表视图中删除行,请修改控制列表视图的适配器所持有的数据。如果适配器是
ArrayAdapter
,请在
ArrayAdapter
上调用
remove()
,并为其指定需要删除的任何项目的位置。然后使用
notifyDataSetChanged()
通知适配器。适配器将刷新ListView,您的违规行将被删除

在代码中,您没有将当前项的位置存储在视图持有者中。将其更改为:

static class CitrusListHolder
{
    //TextView txtTitle;
    Spinner colorSpinner;
    Spinner textureSpinner;
    Spinner soliditySpinner;
    int currentPosition;
}
然后设置支架中的位置

Button rateButton = (Button) row.findViewById(R.id.rate_button);
        rateButton.setTag(position); //delete this line
        holder.currentPosition = position; //storing current position in holder
        rateButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                CitrusListHolder currHolder = (CitrusListHolder) v.getParent().getTag(); //get button's parent which is the row
                data.remove(currHolder.currentPosition);  //get the stored position and remove the corresponding row
                notifyDataSetChanged();
            }
        });

这应该行。

您没有设置
按钮的实际位置

按钮.setTag()
行从
if
的内部移动到设置文本和其他数据的
if else
条件的外部。因此,在滚动或刷新之后,它应该在每次调用
getView()
时获得真实位置,如下所示:

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

    if(row == null)
    {
        //your implementation
    }
    else
    {
        //your implementation
    }

    CitrusList singleLine = data.get(position);
    //holder.txtTitle.setText(singleLine.title);
    rateButton.setTag(String.valueOf(position));  //<==== place it here, so it'll get the real/update position as tag, Convert it to String.
    return row;
}
int position = Integer.parseInt(v.getTag().toString());

如何从数组中删除数据?是否将
整数
设置为
按钮
的标记?此设置没有相同的问题。谢谢。@Jignesh Ansodariya+1它对我有用谢谢(我们必须在getView方法中添加组件时将位置设置为tag)OP删除了该项,并从
按钮的
onClick()
调用了
notifyDataSetChanged()
,我不确定你所说的与我代码中的有什么不同。你能详细说明一下吗?给其他找这个的人。我为一个布局编写了一个自定义适配器,该布局看起来像并且有类似的问题。在我的侦听器中,在异步调用delete成功返回后,我只使用了以下代码
comments.remove(position)notifyDataSetChanged()。我的监听器是在我的自定义适配器中的
getView()
中实现的,在我的设计中,
comments
是作为
ArrayList
加载到我的
BaseAdapter
subclass.Hrm中的
ListView
。我将currentPosition添加到保持架,删除rateButton.setTag行,设置currentPosition=position,并尝试在onClick内索引.currentPosition,但我得到“currentPosition无法解析或不是字段。”当我使用holder.currentPosition(我使保持架成为全局)时,它只删除列表中的最后一行,而不是所选项目,这与此相同。我已编辑了答案。您需要以CitrusListHolder而不是整数的形式获取标记。设定