【问题标题】:Selecting/highlighting multiple items in listview with custom adapter - Android使用自定义适配器在列表视图中选择/突出显示多个项目 - Android
【发布时间】:2014-10-30 04:24:24
【问题描述】:

我遵循了一个很好的教程,做了一些更改,创建了一个自定义 ListView,它允许我在我的 ListView 中为每一行显示多个图像。我想做的是通过选择列表中的多个项目来突出显示,然后通过在我的选项菜单上选择一个选项对所有这些列表项目执行某种操作。但是,我似乎遇到的问题是我无法选择多个项目,即使我已将android:choiceMode="multipleChoice" 添加到 .xml 文件中的 ListView 中。我意识到这可以使用复选框或单选按钮来完成,但我宁愿避免这种情况。我在下面附上了我的源代码。任何帮助,将不胜感激。最后,感谢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>

【问题讨论】:

    标签: java android android-listview custom-adapter


    【解决方案1】:
    1. 您将在列表中显示的每个项目的根 View 必须实现 Checkable。在实现这个接口的时候还要更新 View 的 drawable 状态。请参阅this answer 了解如何执行此操作。

    2. 设置一个&lt;selector&gt; drawable 作为这个根View 的背景。检查状态和正常状态有哪些不同的颜色/可绘制对象。

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

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

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

    【讨论】:

    • 如果我为我的列表实现可检查,列表是否没有复选框?这就是我要避免的。谢谢
    • @Willis No. Checkable 是一个 Java 接口。无论实现它,都承诺拥有setChecked(boolean)toggle() 方法。您想在视图中显示什么完全取决于您。
    • 谢谢。我相信这就是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多