【问题标题】:ListView with CheckBox带有复选框的列表视图
【发布时间】:2014-06-30 16:27:07
【问题描述】:

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

这是我的主要活动代码:

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;  
}
}

那么我在哪里以及如何编写代码以了解通过复选框选择了哪些项目?

【问题讨论】:

    标签: android


    【解决方案1】:

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

    为复选框视图(或整行)实现一个侦听器,以便您可以在复选框处理 onClick 时更新此新参数。

    然后您可以简单地为新的 ListView 使用相同的 Collection(在您的情况下为 ArrayList 项)。

    【讨论】:

    • 非常感谢..你能告诉我怎么做吗?我是新手,我真的不知道该怎么做
    【解决方案2】:

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

    我不知道你想在 alertdialog 中显示什么,但你可以选择每个 CheckBox 并检查 BOOL isChecked() 是否为真。

    所以你可以通过它的孩子遍历整个 listView 并检查 BOOL 是否为真,所以你只有选中的项目。

    【讨论】:

    • 我必须在哪里实现 BOOL isChecked() 方法?我该如何使用它以及在哪里使用?谢谢
    • 你有对象CheckBox 例如你有这个:CheckBox cb = (CheckBox) findViewById(...); 然后你可以用if(cb.isChecked()) { do something }检查它
    • ohh .. 我在适配器类中编写此方法?我在哪里以及如何使用它?
    • 例如,当您设置 onClickListener 时,您可以在侦听器中遍历所有 listView 子项并获取复选框元素并检查复选框是否被选中。然后你可以用复选框做任何你想做的事情。
    • 但是对于 onclicklistenner 我是为行还是复选框设置它?
    【解决方案3】:

    在rowview 上应用点击侦听器并切换该 clcik 上的复选框。也可以使用setTag, getTag 更新项目,无论它是否被点击。然后在适配器中提供一个方法来返回所有带有选中标记的项目。

    试试看:

    // 像这样更新你的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;
    
    }
    

    【讨论】:

    • 你能告诉我怎么做吗?抱歉,我是新手.. 我不知道如何将复选框切换到行视图以及如何使用 setTag 和 getTag。
    • 它给了我和 View.OnClickListener 上的错误
    【解决方案4】:

    将此添加到您的课程中:

    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;
    }
    

    您还必须为您的复选框创建一个实现 onClickListener 的类,看看这个示例:

    // 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
    

    【讨论】:

    • 非常感谢 bean_droid .. 我现在就试试,谢谢
    • 您必须在 getView 的复选框中使用它,如下所示: checkbox.setOnClickListener(new StatusOnClickListener(position,checkbox))
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2018-02-14
    • 2014-04-11
    • 2016-07-25
    相关资源
    最近更新 更多