作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何知道何时选中了 Android 应用程序中自定义 ListView 中的所有复选框?我有一个自定义 ListView ,我只想知道何时选中列表中的所有复选框并向用户显示一条消息,对不起我的英语。
这是我的适配器的代码,但它不起作用...
public class MeuAdapter extends ArrayAdapter<LinhaItem>
{
private final List<LinhaItem> lista;
private final Activity contexto;
private final boolean[] pegos;
private double total = 0;
public MeuAdapter(Activity contexto, List<LinhaItem> lista)
{
super(contexto, R.layout.produtos, lista);
this.contexto = contexto;
this.lista = lista;
pegos = new boolean[this.lista.size()];
for(int i = 0; i < this.lista.size(); i++)
{
pegos[i] = false;
}
}
static class ViewHolder
{
protected TextView texto;
protected CheckBox checkbox;
protected EditText edit;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = null;
final int posicao = position;
if(convertView == null)
{
LayoutInflater inflater = contexto.getLayoutInflater();
view = inflater.inflate(R.layout.produtos, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.texto = (TextView) view.findViewById(R.id.txtDescricao);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkProduto);
viewHolder.edit = (EditText) view.findViewById(R.id.txtValor);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
LinhaItem elemento = (LinhaItem) viewHolder.checkbox.getTag();
elemento.setSelecionado(buttonView.isChecked());
if(elemento.Selecionado())
{
pegos[posicao] = true;
}
total += lista.get(posicao).getValor();
boolean cheia = true;
for(int i = 0; i < lista.size(); i++)
{
cheia = pegos[i];
//Toast.makeText(contexto, "pego["+i+"]"+pegos[i], 10000).show();
}
if(cheia)
{
Toast.makeText(contexto, "Compra finalizada, valor total: " + total, 10000).show();
}
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(lista.get(position));
}
else
{
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(lista.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.texto.setText(lista.get(position).getTexto());
holder.checkbox.setChecked(lista.get(position).Selecionado());
holder.edit.setText(Double.toString((lista.get(position).getValor())));
return view;
}
}
我的新代码是:
package br.com.boitata.cadastroprodutos;
import java.util.List;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.*;
public class CadastroProdutosActivity extends Activity {
private Button btnInserir;
private EditText txtDescricao;
private EditText txtValor;
private TextView txtTotal;
private ListView lstProdutos;
private ProdutoBD bd;
private MeuAdapter adapter;
List<Produto> lista;
List<LinhaItem> linhas;
private double total = 0;
public void preencheLista(List<Produto> lp, ListView lista)
{
int tam = lp.size();
linhas = new ArrayList<LinhaItem>();
for(int i = 0; i < tam; i++)
{
Produto p = lp.get(i);
linhas.add(getLinha(p.getDescricao()));
}
adapter = new MeuAdapter(this, linhas);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, android.R.id.text1, valores);
lista.setAdapter(adapter);
}
public LinhaItem getLinha(String texto)
{
return new LinhaItem(texto);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cadastro_produtos);
btnInserir = (Button) findViewById(R.id.btnInserir);
txtDescricao = (EditText) findViewById(R.id.txtDescricao);
txtValor = (EditText) findViewById(R.id.txtValor);
txtTotal = (TextView) findViewById(R.id.txtTotal);
lstProdutos = (ListView) findViewById(R.id.lstProdutos);
lstProdutos.setBackgroundColor(Color.BLACK);
bd = new ProdutoBD(getApplicationContext());
lista = bd.listaProdutos();
preencheLista(lista, lstProdutos);
btnInserir.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
String checados = "";
for(int i = 0; i < lista.size(); i++)
{
checados += "pego[" + i + "]" + " " + pegos[i] + " - ";
}
Toast.makeText(getApplicationContext(), checados, 40000).show();
/* Produto p = new Produto();
p.setDescricao(txtDescricao.getText().toString());
p.setValor(Double.parseDouble(txtValor.getText().toString()));
bd.insere(p);
lista = bd.listaProdutos();
preencheLista(lista, lstProdutos);
int i = 0;
total = 0;
while(i < lista.size())
{
p = lista.get(i);
total += p.getValor();
i++;
}
txtTotal.setText("Total: " + Double.toString(total));*/
}
});
}
private boolean[] pegos;
private boolean[] passados;
public class MeuAdapter extends ArrayAdapter<LinhaItem>
{
private final List<LinhaItem> lista;
private final Activity contexto;
private double total = 0;
private int qtde = 0;
public MeuAdapter(Activity contexto, List<LinhaItem> lista)
{
super(contexto, R.layout.produtos, lista);
Toast.makeText(contexto, "Construindo", 10000).show();
this.contexto = contexto;
this.lista = lista;
qtde = this.lista.size();
pegos = new boolean[qtde];
passados = new boolean[qtde];
for(int i = 0; i < this.lista.size(); i++)
{
pegos[i] = false;
passados[i] = false;
}
}
public class ViewHolder
{
protected TextView texto;
protected CheckBox checkbox;
protected EditText edit;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = null;
final int posicao = position;
if(convertView == null)
{
LayoutInflater inflater = contexto.getLayoutInflater();
view = inflater.inflate(R.layout.produtos, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.texto = (TextView) view.findViewById(R.id.txtDescricao);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkProduto);
viewHolder.edit = (EditText) view.findViewById(R.id.txtValor);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
LinhaItem elemento = (LinhaItem) viewHolder.checkbox.getTag();
elemento.setSelecionado(buttonView.isChecked());
pegos[posicao] = isChecked;
if(elemento.Selecionado())
{
pegos[posicao] = true;
qtde--;
}
else if(qtde < lista.size() && passados[posicao])
{
qtde++;
}
total += lista.get(posicao).getValor();
boolean cheia = true;
for(int i = 0; i < lista.size(); i++)
{
if(!pegos[i])
{
cheia = false;
break;
}
//Toast.makeText(contexto, "pego["+i+"]"+pegos[i], 10000).show();
}
if(cheia || qtde == 0)
{
Toast.makeText(contexto, "Compra finalizada, valor total: " + total, 10000).show();
}
// Toast.makeText(contexto, "Quantidade não selecionada: " + qtde, 5000).show();
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(lista.get(position));
}
else
{
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(lista.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.texto.setText(lista.get(position).getTexto());
holder.checkbox.setChecked(lista.get(position).Selecionado());
holder.edit.setText(Double.toString((lista.get(position).getValor())));
passados[posicao] = true;
return view;
}
}
}
这只适用于当前出现的行...
最佳答案
要测试您是否选中了列表行中最后一个未选中的 CheckBox
,您可以使用多种方法。这是一个:
boolean allChecked = true;
for(int i = 0; i < lista.size(); i++) {
if (!pegos[i]) {
// it appears that one of our ChckBoxes is currently unchecked so
// we already know that not all CheckBoxes are checked
allChecked = false;
break;
}
if (allChecked) {
// if we get here and allChecked is true than all CheckBoxes are checked
Toast.makeText(contexto, "All checked!!", 10000).show();
}
为避免每次用户检查 CheckBox
时循环 bool 数组,您可以在适配器中有一个 int
字段,它最初是 bool 数组的大小。当用户选中 CheckBox
时,您会从该字段中减少 1
,当用户取消选中 CheckBox
时,您会增加 1
那个字段。在同一个监听器中,您测试该字段是否为 0
,在这种情况下,所有 CheckBoxes
都被选中。
关于android - 带有复选框的自定义 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13788049/
我是一名优秀的程序员,十分优秀!