Android 带复选框的列表视图

Android 带复选框的列表视图,android,Android,作为android编程的初学者,我正在开发一款应用程序。 我必须做一个图像的列表视图,2个文本视图和每行一个复选框。 我必须在操作栏中实现一个“继续”按钮,因此当单击此按钮时,列表中的所有复选框都会显示在另一个listview的警报对话框中。 我面临的问题是,我不知道如何知道选中了哪个复选框,以便实现alertdialog。 有人能帮我吗 这是我的主要活动代码: package com.example.view; import java.util.ArrayList; import andr

作为android编程的初学者,我正在开发一款应用程序。 我必须做一个图像的列表视图,2个文本视图和每行一个复选框。 我必须在操作栏中实现一个“继续”按钮,因此当单击此按钮时,列表中的所有复选框都会显示在另一个listview的警报对话框中。 我面临的问题是,我不知道如何知道选中了哪个复选框,以便实现alertdialog。 有人能帮我吗

这是我的主要活动代码:

package com.example.view;

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {

public static final String TAG = MainActivity.class.getSimpleName();
ListView listView;
ArrayList<ListViewItem> items;
CustomListViewAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listView);
    items = new ArrayList<MainActivity.ListViewItem>();
    items.add(new ListViewItem(R.drawable.ic_launcher, "Item1", "Item1 Description"));
    items.add(new ListViewItem(R.drawable.ic_launcher, "Item2", "Item2 Description"));
    items.add(new ListViewItem(R.drawable.ic_launcher, "Item3", "Item3 Description"));
    items.add(new ListViewItem(R.drawable.ic_launcher, "Item4", "Item4 Description"));
    adapter = new CustomListViewAdapter(this, items);
    listView.setAdapter(adapter);
}

class ListViewItem {
    private int thumbnailResource;
    private String title;
    private String subTitle;

    public ListViewItem()
    {

    }

    public ListViewItem(int thumbnailResource, String title, String subTitle)
    {
        this.thumbnailResource = thumbnailResource;
        this.title = title;
        this.subTitle = subTitle;
    }

    public int getThumbnailResource()
    {
        return thumbnailResource;
    }

    public void setThumbnailResource(int thumbnailResource)
    {
        this.thumbnailResource = thumbnailResource;
    }

    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    public String getSubTitle()
    {
        return subTitle;
    }

    public void setSubTitle(String subTitle)
    {
        this.subTitle = subTitle;
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions_view, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
    case R.id.action_continue:
        doContinue();
        break;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

private void doContinue()
{
// open the alertdialog box depending on the items selected 

}
}
这是我的适配器代码:

package com.example.view;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.view.MainActivity.ListViewItem;

public class CustomListViewAdapter extends ArrayAdapter<ListViewItem>
{
LayoutInflater inflater;
ArrayList<ListViewItem> items;
public CheckBox checkBox;
public static final String TAG = MainActivity.class.getSimpleName();

public CustomListViewAdapter(Activity context, ArrayList<ListViewItem> items)
{  
    super(context, R.layout.list_item_row, items);

    this.items = items;
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public View getView(final int position, View convertView, ViewGroup parent)
{
    //System.out.println(position);
    ListViewItem item = items.get(position);
    View rowview = inflater.inflate(R.layout.list_item_row, parent, false);
    ImageView imgView = (ImageView) rowview.findViewById(R.id.imgThumbnail);
    TextView txtTitle = (TextView) rowview.findViewById(R.id.txtTitle);
    TextView txtSubTitle = (TextView) rowview.findViewById(R.id.txtSubTitle);
    CheckBox checkBox = (CheckBox) rowview.findViewById(R.id.checkbox);

    imgView.setImageResource(item.getThumbnailResource());
    txtTitle.setText(item.getTitle());
    txtSubTitle.setText(item.getSubTitle());

    return rowview;  
}
}
因此,我可以在何处以及如何编写代码,以了解通过复选框选择了哪些项目?

在行视图上单击“应用侦听器”,并在该clcik上切换复选框。还可以使用setTag、getTag更新项目,无论是否单击。然后在adapter中提供一个方法来返回带有选中标记的所有项

试试看:

//像这样更新您的getView

public View getView(final int position, View convertView, ViewGroup parent)
{
    //System.out.println(position);
    ListViewItem item = items.get(position);
    View rowview = inflater.inflate(R.layout.list_item_row, parent, false);
    ImageView imgView = (ImageView) rowview.findViewById(R.id.imgThumbnail);
    TextView txtTitle = (TextView) rowview.findViewById(R.id.txtTitle);
    TextView txtSubTitle = (TextView) rowview.findViewById(R.id.txtSubTitle);
    CheckBox checkBox = (CheckBox) rowview.findViewById(R.id.checkbox);

    imgView.setImageResource(item.getThumbnailResource());
    txtTitle.setText(item.getTitle());
    txtSubTitle.setText(item.getSubTitle());

    rowview.setOnClickListener(new View.OnClickListener(e){
        @override>
        public void onClick(view v) {
            if(item.getSelected() ){
                item.setSelected(false);
                checkBox set unselected resource
            } else {
                item.setSelected(true);
                checkBox set selected resource
            }

        }
    });


    return rowview;
}
//添加一个获取选中项的方法

public List<ListViewItem> getSelectedItems() {
    List<ListViewItem> selectedItems = new ArrayList<ListViewItem>();
    for(ListViewItem item: items) {
        if(item.getSelected())
            selectedItems.add(item)
    }
    return   selectedItems;

}
一个简单的解决方案: 例如,在ListViewItem模型上有一个使复选框状态保持为布尔值的参数

为复选框视图或整行实现侦听器,以便在复选框处理onClick时更新此新参数


然后,您只需在案例ArrayList项目中为新的ListView使用相同的集合。

一种方法是,在传递或单击ArrayList以执行操作后,将每个选中的项目或整个视图添加到ArrayList中

我不知道您想在alertdialog中显示什么,但是您可以选中每个复选框,并检查BOOL isChecked是否为true


因此,您可以按其子级遍历整个listView,并检查BOOL是否为true,因此您只有选中的项。

将此项添加到您的类中:

class ListViewItem {
         private boolean isChecked = false;
         public boolean isChecked(){
         return this.isChecked;
          }
         public void setChecked(boolean checked){
             this.isChecked = checked
          }
在getView方法中添加以下内容:

if (items.get(position).isChecked){
   checkbox.setChecked(true);
}else{
 checkbox.setChecked(false);
}
要获取所有选中项,请将其添加到适配器类:

public ArrayList<ListViewItem> getCheckedItems(){
        ArrayList<ListViewItem> checkedItem = new Arr......

        For (ListViewItem items:item){
           if (items.isChecked){
             checkedItem.add(items);
            }
}
     return checkeditem;
}

你能告诉我怎么做吗?对不起,我是新手。。我不知道如何将复选框切换到rowview,以及如何使用setTag和getTag.It’s giving and error on the View.onClickListener我必须在哪里实现BOOL isChecked方法?我如何使用它,在哪里?谢谢你有对象复选框,例如你有:复选框cb=CheckBox findViewById。。。;然后你可以用ifcb.isChecked{do something}哦。。我在adapter类中编写这个方法?我在哪里以及如何使用它?例如,当您设置onClickListener时,您可以在侦听器中遍历所有listView子项并获取checkbox元素,并检查是否选中了该复选框。然后你可以用复选框做任何你想做的事情。但是对于onClickListener,我是为行还是为复选框设置它呢?非常感谢。。你能告诉我怎么做吗?我是新来的,我真的不知道怎么做。我有很多豆豆机器人。。我现在就试试,谢谢您必须在getView的复选框中使用它,如下所示:checkbox.setonclicklistenernewstatusonclicklistenerposition,checkbox
// private class StatusOnClickListener
private class StatusOnClickListener implements OnClickListener {
    private CheckBox viewHolder;
    private int _position;

    public StatusOnClickListener(final int position, CheckBox _viewholder) {
        viewHolder = _viewholder;
        _position = position;
    }

    @Override
    public void onClick(View v) {
        if (viewHolder.isChecked()) {
            List.get(_position).setChecked(true);
        } else {
            List.get(_position).setChecked(false);
        }
    }
}// end