簡體   English   中英

如何使用自定義baseadapter從listView中刪除項目

[英]How to delete item from listView with custom baseadapter

我遇到一個問題,我有一個列表視圖,我想在單擊按鈕時從中刪除一個項目。 我可以在互聯網上找到示例,但我無法使它們正常工作。 我怎樣才能做到這一點?

這是我的代碼:

public class GroupRequestCustomAdapter extends BaseAdapter {
    String [] result;
    Context context;
    String [] imageId;
    String [] groupId;

private static LayoutInflater inflater=null;

public GroupRequestCustomAdapter(GroupRequests ListActivity, String[] prgmNameList, String[] prgmImages, String [] GroupId) {

    // TODO Auto-generated constructor stub

    result=prgmNameList;
    context=ListActivity;
    imageId=prgmImages;
    groupId = GroupId;
    inflater = ( LayoutInflater )context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return result.length;

}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

public class Holder
{
    TextView tv;
    ImageView img;
    Button accept;
    Button decline;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Holder holder=new Holder();
    View rowView;
    //Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), imageId[position]);
    //Bitmap bitmap = getBitmapFromURL(imageId[position]);
    rowView = inflater.inflate(R.layout.group_request_list, null);
    holder.tv=(TextView) rowView.findViewById(R.id.textView1);
    holder.img=(ImageView) rowView.findViewById(R.id.imageView1);
    holder.tv.setText(result[position]);
    holder.accept=(Button) rowView.findViewById(R.id.buttonAccept);
    holder.decline=(Button) rowView.findViewById(R.id.buttonDecline);

    if (holder.img != null) {
        new GetImageFromUrl(holder.img,context).execute(imageId[position]);
    }

    holder.accept.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.v("Button click", "accept");
        }
    });
    holder.decline.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.v("Button click", "Decline");

        }
    });
    return rowView;

}
}

您可以在適配器中添加方法來為您執行此操作:

public void deleteItem (int position) {
    result.remove(position);
    // remove(int) does not exist for arrays, you would have to write that method yourself or use a List instead of an array
    notifyDataSetChanged();
}

public void deleteItem (String itemToDelete) {
    result.remove(itemToDelete);
    // remove(int) does not exist for arrays, you would have to write that method yourself or use a List instead of an array
    notifyDataSetChanged();
}

順便說一句,您的getItem(int position)實現是錯誤的,它應該返回result.get(position) getItemId還應該返回一個有意義的id; 就您而言,我認為重返職位還可以。

編輯

我注意到您的構造函數需要3個不同的列表。 結果,您將很難處理數據集中的更改,因為如果從結果中刪除一個項目,則也必須從其他列表中刪除相應的項目。 我強烈建議您按照以下方式重新定義您的適配器:

public GroupRequestCustomAdapter(GroupRequests ListActivity, List<MyObject>)

MyObject是一個非常簡單的類,包含ListView中一項的數據,例如:

public class MyObject {
    private String prgmName;
    private String prgmImage;
    // other required fields.

    // required getters/setters
}

這樣,您只有一個List可以在適配器內部進行管理,而不是像現在那樣管理resultimageIdgroupId 並且可以在List上調用remove(int position)。

最后,您還可以考慮擴展ArrayAdapter而不是BaseAdapter ,它具有BaseAdapter不具備的一些有用方法,包括...您猜對了: remove方法;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM