列表视图的自定义适配器

我想为我的列表视图创build一个custom adapter 。 有没有什么文章可以引导我如何创build一个并解释它是如何工作的?

     public class ListAdapter extends ArrayAdapter<Item> { public ListAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public ListAdapter(Context context, int resource, List<Item> items) { super(context, resource, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); v = vi.inflate(R.layout.itemlistrow, null); } Item p = getItem(position); if (p != null) { TextView tt1 = (TextView) v.findViewById(R.id.id); TextView tt2 = (TextView) v.findViewById(R.id.categoryId); TextView tt3 = (TextView) v.findViewById(R.id.description); if (tt1 != null) { tt1.setText(p.getId()); } if (tt2 != null) { tt2.setText(p.getCategory().getId()); } if (tt3 != null) { tt3.setText(p.getDescription()); } } return v; } } 

    这是我用于我的项目的课程。 您需要收集您要显示的项目的集合,在我的情况下是<Item> 。 你需要重写View getView(int position, View convertView, ViewGroup parent)方法。

    R.layout.itemlistrow定义了ListView的行。

     <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:orientation="vertical" android:layout_width="fill_parent"> <TableRow android:layout_width="fill_parent" android:id="@+id/TableRow01" android:layout_height="wrap_content"> <TextView android:textColor="#FFFFFF" android:id="@+id/id" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="id" android:textStyle="bold" android:gravity="left" android:layout_weight="1" android:typeface="monospace" android:height="40sp" /> </TableRow> <TableRow android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:textColor="#FFFFFF" android:id="@+id/categoryId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="categoryId" android:layout_weight="1" android:height="20sp" /> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1" android:textColor="#FFFFFF" android:gravity="right" android:id="@+id/description" android:text="description" android:height="20sp" /> </TableRow> </TableLayout> 

    MainActivity像这样定义ListView

     ListView yourListView = (ListView) findViewById(R.id.itemListView); // get data from the table by the ListAdapter ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List<yourItem>); yourListView .setAdapter(customAdapter); 

    我知道这已经得到了答复…但我想给一个更完整的例子。

    在我的例子中,将显示我们的自定义ListViewOptionsActivity称为OptionsActivity ,因为在我的项目中,这个Activity将显示我的用户可以设置来控制我的应用程序的不同选项。 有两个列表项types,一个列表项types只有一个TextView ,第二个列表项types只有一个Button 。 你可以在每个列表项types中放置你喜欢的任何小部件,但是我保持这个例子简单。

    getItemView()方法检查哪些列表项应该是types1或types2.根据我定义的顶部的静态整数,前5个列表项将是列表项types1,最后5个列表项将列表item type 2.因此,如果你编译并运行这个,你将会得到一个ListView ,它有五个只包含一个Button项目,然后是五个只包含一个TextView

    以下是Activity代码,活动xml文件和每个列表项types的xml文件。

    OptionsActivity.java:

     public class OptionsActivity extends ListActivity { private static final int LIST_ITEM_TYPE_1 = 0; private static final int LIST_ITEM_TYPE_2 = 1; private static final int LIST_ITEM_TYPE_COUNT = 2; private static final int LIST_ITEM_COUNT = 10; // The first five list items will be list item type 1 // and the last five will be list item type 2 private static final int LIST_ITEM_TYPE_1_COUNT = 5; private MyCustomAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new MyCustomAdapter(); for (int i = 0; i < LIST_ITEM_COUNT; i++) { if (i < LIST_ITEM_TYPE_1_COUNT) mAdapter.addItem("item type 1"); else mAdapter.addItem("item type 2"); } setListAdapter(mAdapter); } private class MyCustomAdapter extends BaseAdapter { private ArrayList<String> mData = new ArrayList<String>(); private LayoutInflater mInflater; public MyCustomAdapter() { mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void addItem(final String item) { mData.add(item); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if(position < LIST_ITEM_TYPE_1_COUNT) return LIST_ITEM_TYPE_1; else return LIST_ITEM_TYPE_2; } @Override public int getViewTypeCount() { return LIST_ITEM_TYPE_COUNT; } @Override public int getCount() { return mData.size(); } @Override public String getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; int type = getItemViewType(position); if (convertView == null) { holder = new ViewHolder(); switch(type) { case LIST_ITEM_TYPE_1: convertView = mInflater.inflate(R.layout.list_item_type1, null); holder.textView = (TextView)convertView.findViewById(R.id.list_item_type1_text_view); break; case LIST_ITEM_TYPE_2: convertView = mInflater.inflate(R.layout.list_item_type2, null); holder.textView = (TextView)convertView.findViewById(R.id.list_item_type2_button); break; } convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; } } public static class ViewHolder { public TextView textView; } } 

    activity_options.xml:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/optionsList" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> 

    list_item_type_1.xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_type1_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/list_item_type1_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Text goes here" /> </LinearLayout> 

    list_item_type2.xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_type2_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/list_item_type2_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button text goes here" /> </LinearLayout> 

    这段代码很容易理解。

    three_horizo​​ntal_text_views_layout.xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/leftTextView"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/centreTextView"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rightTextView"/> </LinearLayout> 

    ThreeStrings.java

     public class ThreeStrings { private String left; private String right; private String centre; public ThreeStrings(String left, String right, String centre) { this.left = left; this.right = right; this.centre = centre; } } 

    ThreeHorizo​​ntalTextViewsAdapter.java

     public class ThreeHorizontalTextViewsAdapter extends ArrayAdapter<ThreeStrings> { private int layoutResource; public ThreeHorizontalTextViewsAdapter(Context context, int layoutResource, List<ThreeStrings> threeStringsList) { super(context, layoutResource, threeStringsList); this.layoutResource = layoutResource; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater layoutInflater = LayoutInflater.from(getContext()); view = layoutInflater.inflate(layoutResource, null); } ThreeStrings threeStrings = getItem(position); if (threeStrings != null) { TextView leftTextView = (TextView) view.findViewById(R.id.leftTextView); TextView rightTextView = (TextView) view.findViewById(R.id.rightTextView); TextView centreTextView = (TextView) view.findViewById(R.id.centreTextView); if (leftTextView != null) { leftTextView.setText(threeStrings.getLeft()); } if (rightTextView != null) { rightTextView.setText(threeStrings.getRight()); } if (centreTextView != null) { centreTextView.setText(threeStrings.getCentre()); } } return view; } } 

    main_layout.xml

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.androidapplication.ListActivity"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView"></ListView> </LinearLayout> 

    MainActivity.java

     public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<ThreeStrings> threeStringsList = new ArrayList<>(); ThreeStrings threeStrings = new ThreeStrings("a", "b", "c"); threeStringsList.add(threeStrings); ListView listView = (ListView)findViewById(R.id.listView); ThreeHorizontalTextViewsAdapter threeHorizontalTextViewsAdapter = new ThreeHorizontalTextViewsAdapter(this, R.layout.three_horizontal_text_views_layout, threeStringsList); listView.setAdapter(threeHorizontalTextViewsAdapter); } //......} 

    Google有一个名为EfficientAdapter的例子,在我看来,它是如何实现自定义适配器的最简单的例子。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html @CommonsWare已经写了上面例子中使用的模式的一个很好的解释http:// commonsware.com/Android/excerpt.pdf

    你可以看一下ApiDemos官方的这个例子 。 它显示了如何扩展BaseAdapter并将其应用于ListView 。 之后,只需查看BaseAdapter的参考资料,并试着了解每种方法(包括inheritance的方法)以及何时/如何使用它。

    另外, 谷歌是你的朋友:)。

    检查这个链接 ,非常简单的通过convertView ,我们可以得到一个将显示在列表视图(这是parentView视图)的行的布局。

     View v = convertView; if (v == null) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); v = vi.inflate(R.layout.itemlistrow, null); } 

    使用该位置,您可以获取List<Item>的对象。

     Item p = items.get(position); 

    之后,我们将不得不将对象的所需细节设置为已识别的窗体小部件。

     if (p != null) { TextView tt = (TextView) v.findViewById(R.id.id); TextView tt1 = (TextView) v.findViewById(R.id.categoryId); TextView tt3 = (TextView) v.findViewById(R.id.description); if (tt != null) { tt.setText(p.getId()); } if (tt1 != null) { tt1.setText(p.getCategory().getId()); } if (tt3 != null) { tt3.setText(p.getDescription()); } } 

    那么它将返回将被附加到parentView (这是一个ListView / GridView )的构造的视图。

    下面是完整的步骤,为逐步创build列表视图的自定义适配器 –

    https://www.caveofprogramming.com/guest-posts/custom-listview-with-imageview-and-textview-in-android.html

     public class CustomAdapter extends BaseAdapter{ String [] result; Context context; int [] imageId; private static LayoutInflater inflater=null; public CustomAdapter(MainActivity mainActivity, String[] prgmNameList, int[] prgmImages) { // TODO Auto-generated constructor stub result=prgmNameList; context=mainActivity; imageId=prgmImages; 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; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Holder holder=new Holder(); View rowView; rowView = inflater.inflate(R.layout.program_list, null); holder.tv=(TextView) rowView.findViewById(R.id.textView1); holder.img=(ImageView) rowView.findViewById(R.id.imageView1); holder.tv.setText(result[position]); holder.img.setImageResource(imageId[position]); rowView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(context, "You Clicked "+result[position], Toast.LENGTH_LONG).show(); } }); return rowView; } } 

    数据模型

     public class DataModel { String name; String type; String version_number; String feature; public DataModel(String name, String type, String version_number, String feature ) { this.name=name; this.type=type; this.version_number=version_number; this.feature=feature; } public String getName() { return name; } public String getType() { return type; } public String getVersion_number() { return version_number; } public String getFeature() { return feature; } 

    }

    arrays适配器

     public class CustomAdapter extends ArrayAdapter<DataModel> implements View.OnClickListener{ private ArrayList<DataModel> dataSet; Context mContext; // View lookup cache private static class ViewHolder { TextView txtName; TextView txtType; TextView txtVersion; ImageView info; } public CustomAdapter(ArrayList<DataModel> data, Context context) { super(context, R.layout.row_item, data); this.dataSet = data; this.mContext=context; } @Override public void onClick(View v) { int position=(Integer) v.getTag(); Object object= getItem(position); DataModel dataModel=(DataModel)object; switch (v.getId()) { case R.id.item_info: Snackbar.make(v, "Release date " +dataModel.getFeature(), Snackbar.LENGTH_LONG) .setAction("No action", null).show(); break; } } private int lastPosition = -1; @Override public View getView(int position, View convertView, ViewGroup parent) { // Get the data item for this position DataModel dataModel = getItem(position); // Check if an existing view is being reused, otherwise inflate the view ViewHolder viewHolder; // view lookup cache stored in tag final View result; if (convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.row_item, parent, null); viewHolder.txtName = (TextView) convertView.findViewById(R.id.name); viewHolder.txtType = (TextView) convertView.findViewById(R.id.type); viewHolder.txtVersion = (TextView) convertView.findViewById(R.id.version_number); viewHolder.info = (ImageView) convertView.findViewById(R.id.item_info); result=convertView; convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); result=convertView; } Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); result.startAnimation(animation); lastPosition = position; viewHolder.txtName.setText(dataModel.getName()); viewHolder.txtType.setText(dataModel.getType()); viewHolder.txtVersion.setText(dataModel.getVersion_number()); viewHolder.info.setOnClickListener(this); viewHolder.info.setTag(position); // Return the completed view to render on screen return convertView; } 

    }

    主要活动

     public class MainActivity extends AppCompatActivity { ArrayList<DataModel> dataModels; ListView listView; private static CustomAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); listView=(ListView)findViewById(R.id.list); dataModels= new ArrayList<>(); dataModels.add(new DataModel("Apple Pie", "Android 1.0", "1","September 23, 2008")); dataModels.add(new DataModel("Banana Bread", "Android 1.1", "2","February 9, 2009")); dataModels.add(new DataModel("Cupcake", "Android 1.5", "3","April 27, 2009")); dataModels.add(new DataModel("Donut","Android 1.6","4","September 15, 2009")); dataModels.add(new DataModel("Eclair", "Android 2.0", "5","October 26, 2009")); dataModels.add(new DataModel("Froyo", "Android 2.2", "8","May 20, 2010")); dataModels.add(new DataModel("Gingerbread", "Android 2.3", "9","December 6, 2010")); dataModels.add(new DataModel("Honeycomb","Android 3.0","11","February 22, 2011")); dataModels.add(new DataModel("Ice Cream Sandwich", "Android 4.0", "14","October 18, 2011")); dataModels.add(new DataModel("Jelly Bean", "Android 4.2", "16","July 9, 2012")); dataModels.add(new DataModel("Kitkat", "Android 4.4", "19","October 31, 2013")); dataModels.add(new DataModel("Lollipop","Android 5.0","21","November 12, 2014")); dataModels.add(new DataModel("Marshmallow", "Android 6.0", "23","October 5, 2015")); adapter= new CustomAdapter(dataModels,getApplicationContext()); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { DataModel dataModel= dataModels.get(position); Snackbar.make(view, dataModel.getName()+"\n"+dataModel.getType()+" API: "+dataModel.getVersion_number(), Snackbar.LENGTH_LONG) .setAction("No action", null).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } 

    }

    row_item.xml

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="Marshmallow" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="@android:color/black" /> <TextView android:id="@+id/type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/name" android:layout_marginTop="5dp" android:text="Android 6.0" android:textColor="@android:color/black" /> <ImageView android:id="@+id/item_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@android:drawable/ic_dialog_info" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"> <TextView android:id="@+id/version_heading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="API: " android:textColor="@android:color/black" android:textStyle="bold" /> <TextView android:id="@+id/version_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="23" android:textAppearance="?android:attr/textAppearanceButton" android:textColor="@android:color/black" android:textStyle="bold" /> </LinearLayout> 

    自定义适配器的更简洁的示例(使用列表数组作为我的数据):

     class MyAdapter extends ArrayAdapter<Object> { public ArrayAdapter(Context context, List<MyObject> objectList) { super(context, R.layout.my_list_item, R.id.textViewTitle, objectList.toArray()); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = super.getView(position, convertView, parent); TextView title = (TextView) row.findViewById(R.id.textViewTitle); ImageView icon = (ImageView) row.findViewById(R.id.imageViewAccessory); MyObject obj = (MyObject) getItem(position); icon.setImageBitmap( ... ); title.setText(obj.name); return row; } } 

    这是如何使用它:

     List<MyObject> objectList = ... MyAdapter adapter = new MyAdapter(this.getActivity(), objectList); listView.setAdapter(adapter); 

    BaseAdapter是用于listview的最佳自定义适配器。

     Class MyAdapter extends BaseAdapter{} 

    它有很多function,如getCount()getView()

    公共类CustomAdapter扩展BaseAdapter {

     ArrayList<BookPojo> data; Context ctx; int index=0; public CustomAdapter(ArrayList<BookPojo> data, Context ctx) { super(); this.data = data; this.ctx = ctx; } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertview, ViewGroup parent) { // TODO Auto-generated method stub View v=convertview; if(v==null){ LayoutInflater vi=LayoutInflater.from(ctx); v=vi.inflate(R.layout.messgeview,null); } RelativeLayout rlmessage=(RelativeLayout)v.findViewById(R.id.rlmessgeview); TextView tvisdn=(TextView)v.findViewById(R.id.tvisdn); TextView tvtitle=(TextView)v.findViewById(R.id.tvtitle); TextView tvauthor=(TextView)v.findViewById(R.id.tvauthor); TextView tvprice=(TextView)v.findViewById(R.id.tvprice); BookPojo bpj=data.get(position); tvisdn.setText(bpj.isdn+""); tvtitle.setText(bpj.title); tvauthor.setText(bpj.author); tvprice.setText(bpj.price+""); if(index%2==0) { rlmessage.setBackgroundColor(Color.BLUE); } else { rlmessage.setBackgroundColor(Color.YELLOW); } index++; return v; } 

    }

    这很简单。

     import android.content.Context; import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by Belal on 9/14/2017. */ //we need to extend the ArrayAdapter class as we are building an adapter public class MyListAdapter extends ArrayAdapter<Hero> { //the list values in the List of type hero List<Hero> heroList; //activity context Context context; //the layout resource file for the list items int resource; //constructor initializing the values public MyListAdapter(Context context, int resource, List<Hero> heroList) { super(context, resource, heroList); this.context = context; this.resource = resource; this.heroList = heroList; } //this will return the ListView Item as a View @NonNull @Override public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { //we need to get the view of the xml for our list item //And for this we need a layoutinflater LayoutInflater layoutInflater = LayoutInflater.from(context); //getting the view View view = layoutInflater.inflate(resource, null, false); //getting the view elements of the list from the view ImageView imageView = view.findViewById(R.id.imageView); TextView textViewName = view.findViewById(R.id.textViewName); TextView textViewTeam = view.findViewById(R.id.textViewTeam); Button buttonDelete = view.findViewById(R.id.buttonDelete); //getting the hero of the specified position Hero hero = heroList.get(position); //adding values to the list item imageView.setImageDrawable(context.getResources().getDrawable(hero.getImage())); textViewName.setText(hero.getName()); textViewTeam.setText(hero.getTeam()); //adding a click listener to the button to remove item from the list buttonDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //we will call this method to remove the selected value from the list //we are passing the position which is to be removed in the method removeHero(position); } }); //finally returning the view return view; } //this method will remove the item from the list private void removeHero(final int position) { //Creating an alert dialog to confirm the deletion AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Are you sure you want to delete this?"); //if the response is positive in the alert builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //removing the item heroList.remove(position); //reloading the list notifyDataSetChanged(); } }); //if response is negative nothing is being done builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); //creating and displaying the alert dialog AlertDialog alertDialog = builder.create(); alertDialog.show(); } } 

    来源: 自定义ListView Android教程