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 を制御しているアダプタが保持するデータを変更します。アダプタが の場合は、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 に答える