0

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

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

4 回答 4

5

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

于 2013-02-27T07:41:53.620 回答
2

我认为你应该试试这个

rateButton.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            int index = Integer.parseInt(v.getTag().toString())
            data.remove(index);
            notifyDataSetChanged();
        }
    });
于 2013-02-27T07:40:49.790 回答
1

要从 ListView 中删除一行,您需要修改控制 ListView 的 Adapter 持有的数据。如果适配器是ArrayAdapter,请调用remove()ArrayAdapter给它您需要删除的任何项目的位置。然后使用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();
            }
        });

那应该行得通。

于 2013-02-27T07:43:22.997 回答
0

您没有将实际位置设置为Button.

将您的Button.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;
}

并在获得它的同时onClick()。将其转换为String然后将其转换为Integer这样的:

int position = Integer.parseInt(v.getTag().toString());
于 2013-02-27T07:48:44.067 回答