使用自定义适配器在列表视图中select/突出显示多个项目 – Android

我跟着一个很好的教程,做了一些更改,创build一个自定义的ListView,允许我在ListView的每一行显示多个图像。 我想要做的是通过select列表中的多个项目来突出显示,然后通过在“选项”菜单上select一个选项对所有这些列表项目执行某种操作。 然而,我似乎android:choiceMode="multipleChoice"的问题是,我不能select多个项目,即使我已经添加到ListView在.xml文件中的android:choiceMode="multipleChoice" 。 我意识到这可以使用checkbox或单选button来完成,但我宁愿避免这种情况。 下面附上我的源代码。 任何帮助,将不胜感激。 最后,感谢http://custom-android-dn.blogspot.com/一个很好的教程。 谢谢。

CustomlistviewActivity.java

 package DucNguyen.example.customlistview; public class CustomlistviewActivity extends Activity { private ListView listViewFootballLegend; private Context ctx; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_customlistview); ctx=this; List<FootballLegend> legendList= new ArrayList<FootballLegend>(); legendList.add(new FootballLegend("Pele","October 23, 1940 (age 72)","pele","brazil")); legendList.add(new FootballLegend("Diego Maradona","October 30, 1960 (age 52)","maradona","argentina")); legendList.add(new FootballLegend("Johan Cruyff","April 25, 1947 (age 65)","cruyff","netherlands")); legendList.add(new FootballLegend("Franz Beckenbauer","September 11, 1945 (age 67)","beckenbauer","germany")); legendList.add(new FootballLegend("Michel Platini","June 21, 1955 (age 57)","platini","france")); legendList.add(new FootballLegend("Ronaldo De Lima","September 22, 1976 (age 36)","ronaldo","brazil")); listViewFootballLegend = ( ListView ) findViewById( R.id.FootballLegend_list); listViewFootballLegend.setAdapter( new FootballLegendListAdapter(ctx, R.layout.legend_row_item, legendList ) ); // Click event for single list row listViewFootballLegend.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { FootballLegend o = (FootballLegend) parent.getItemAtPosition(position); Toast.makeText(CustomlistviewActivity.this, o.getName().toString(), Toast.LENGTH_SHORT).show(); } }); } } 

FootballLegendListAdapter.java

 package DucNguyen.example.customlistview; public class FootballLegendListAdapter extends ArrayAdapter<FootballLegend> { private int resource; private LayoutInflater inflater; private Context context; public FootballLegendListAdapter ( Context ctx, int resourceId, List<FootballLegend> objects) { super( ctx, resourceId, objects ); resource = resourceId; inflater = LayoutInflater.from( ctx ); context=ctx; } @Override public View getView ( int position, View convertView, ViewGroup parent ) { convertView = ( RelativeLayout ) inflater.inflate( resource, null ); FootballLegend Legend = getItem( position ); TextView legendName = (TextView) convertView.findViewById(R.id.legendName); legendName.setText(Legend.getName()); TextView legendBorn = (TextView) convertView.findViewById(R.id.legendBorn); legendBorn.setText(Legend.getNick()); ImageView legendImage = (ImageView) convertView.findViewById(R.id.legendImage); String uri = "drawable/" + Legend.getImage(); int imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName()); Drawable image = context.getResources().getDrawable(imageResource); legendImage.setImageDrawable(image); ImageView NationImage = (ImageView) convertView.findViewById(R.id.Nation); uri = "drawable/" + Legend.getNation(); imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName()); image = context.getResources().getDrawable(imageResource); NationImage.setImageDrawable(image); return convertView; } } 

FootballLegend.java

 package DucNguyen.example.customlistview; public class FootballLegend { public FootballLegend(String name, String born, String image, String nation) { super(); this.name = name; this.born = born; this.image = image; this.nation = nation; } private String name; private String born; private String image; private String nation; public String getName() { return name; } public void setName(String nameText) { name = nameText; } public String getNick() { return born; } public void setNick(String born) { this.born = born; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } public String getNation() { return nation; } public void setNation(String image) { this.image = nation; } } 

legend_row_item.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="5dip" > <!-- ListRow Left side Thumbnail image --> <LinearLayout android:id="@+id/thumbnail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dip" android:layout_alignParentLeft="true" android:layout_marginRight="5dip"> <ImageView android:id="@+id/legendImage" android:layout_width="50dip" android:layout_height="50dip" /> </LinearLayout> <TextView android:id="@+id/legendName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/thumbnail" android:layout_toRightOf="@+id/thumbnail" android:textColor="#040404" android:typeface="sans" android:textSize="15dip" android:textStyle="bold"/> <TextView android:id="@+id/legendBorn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/legendName" android:textColor="#343434" android:textSize="10dip" android:layout_marginTop="1dip" android:layout_toRightOf="@+id/thumbnail" /> <ImageView android:id="@+id/Nation" android:layout_width="45dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:layout_centerVertical="true" /> </RelativeLayout> 

activity_customlistview.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/FootballLegend_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="5dp" android:choiceMode="multipleChoice" > </ListView> </LinearLayout> 

Solutions Collecting From Web of "使用自定义适配器在列表视图中select/突出显示多个项目 – Android"

  1. 您将在列表中显示的每个项目的根View必须实现可检查。 当实现这个接口的时候也更新View的可绘制状态。 看到这个答案如何做到这一点。

  2. 为此根View设置一个<selector> drawable作为背景。 检查状态和正常状态有哪些不同的颜色/绘图。

  3. ListView的select模式设置为单选或多选。

  4. 在列表适配器中,使用上面创build的视图作为父级布局提供项目视图。

现在, ListView将负责在其项目视图中设置选中/未选中状态。 您也可以调用ListView上的getCheckedItemIds()getCheckedItemPositions()来获取当前选定的项目。