2014-06-30 63 views
0

我正在开发一个应用程序,作为android编程的初学者。 我必须做一个图像的列表视图,2个文字和每行的复选框。 我必须在操作栏中实现一个继续按钮,所以当单击此按钮时,列表中所有选中的复选框将出现在另一个列表视图的提示对话框中。 我面临的问题是,我不知道如何知道哪个复选框被选中,所以我可以实现alertdialog。 任何人都可以帮助我吗?ListView with CheckBox

这是我的主要活动代码:

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

所以在那里,我怎么能写我的代码知道通过复选框选择哪些项目?

回答

0

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; 

} 
+0

你能告诉我该怎么做吗?对不起,我是新来的..我不知道如何切换复选框到rowview以及如何使用setTag和getTag。 – user3783005

+0

谢谢@Ammar – user3783005

+0

@ user3783005检查代码plz – Ammar

0

一个简单的办法: 对ListViewItem的参数保持复选框状态的模型(例如布尔值)。

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

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

+0

非常感谢..你能告诉我如何?我是新的我不知道该怎么做 – user3783005

0

一种方法是将每个选中的项目或整个视图添加到ArrayList中,然后通过或单击它来执行操作。

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

所以你可以通过它的孩子浏览整个listView并检查BOOL是否为true,所以你只有检查的项目。

+0

我在哪里必须实现BOOL isChecked()方法?我该如何使用它以及在哪里?谢谢 – user3783005

+0

你有对象'CheckBox'例如你有这个:'CheckBox cb =(CheckBox)findViewById(...); '然后你可以检查它'if(cb.isChecked()){做点什么}' – mapodev

+0

ohh ..我写这个方法在适配器类?以及我在哪里以及如何使用它? – user3783005

0

添加到您的类:

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 
+0

感谢了很多bean_droid ..我现在试试吧谢谢 – user3783005

+0

你必须在你的getView中使用它checkbox.setOnClickListener(new StatusOnClickListener(position,checkbox)) –

+0

okeey thank您 – user3783005