ListView で奇妙な動作が発生しています。ListView は 1 つだけです。アプリには多くの ListView がありますが、これだけで発生しています。
説明してみますが、一番下までスクロールすると、スクロールが進み、最後に止まります。一番上までスクロールすると、スクロールが上に飛び散って下に戻ってくるようなものです。
問題を示すこのビデオがあります。
これは、ListView の私の xml です。
<ListView
android:id="@+id/lv_resultado_produtos"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@color/Black"
android:dividerHeight="1dip"
android:fastScrollEnabled="true"
android:scrollX="0dip"
android:scrollY="0dip"
android:scrollbarSize="22dip"
android:scrollbarStyle="outsideOverlay" />
そして、プログラムで CustomAdapter を使用してアダプターを設定するだけで、それ以上は何もしません。
他の ListViews でテストしましたが、この動作は得られませんでした。
誰かがこれについて私を助けてくれたらうれしいです。
[編集]
これが私のアダプターです。少し複雑です。申し訳ありませんが、すべてを保持しようとしましたが、文字のサイズに制限があります。
[PACKAGE]
[IMPORTS]
public class CustomAdapter_Produto_Insercao extends ArrayAdapter<Produto_Insercao> {
static View view_aux = null;
static OnClickListener listener_convertView = null;
static OnClickListener listener_btn_editar_produto = null;
static Activity ctx;
static Dialog_TW ad_estoque;
static List<Condicao_Preco> list_tabela_preco_condicao;
public static boolean clickable = true;
public static boolean highlight = false;
public static int linha_atual = 0;
public static View view_atual = null;
static boolean id_margem = false;
static boolean id_destaca_ipi = false;
static String ls_id_tipo_regime;
static Integer li_cd_cliente;
static String caminho_foto;
static DecimalFormat decimalFormat = null;
static Repositorio repositorio;
static Condicao_Preco c_p_null;
static boolean inNotify = false;
private final LayoutInflater inflater;
private final int resourceId;
public void setClickable(Boolean b){
clickable = b;
}
public CustomAdapter_Produto_Insercao setId_margem(boolean id_margem){
this.id_margem = id_margem;
return this;
}
public CustomAdapter_Produto_Insercao setHighlight(boolean highlight){
this.highlight = highlight;
return this;
}
public CustomAdapter_Produto_Insercao setListener_convertView(OnClickListener listener){
this.listener_convertView = listener;
return this;
}
public CustomAdapter_Produto_Insercao setListener_btn_editar_produto(OnClickListener listener){
this.listener_btn_editar_produto = listener;
return this;
}
public CustomAdapter_Produto_Insercao(Activity context, int resource, List<Produto_Insercao> objects, List<Condicao_Preco> list_tabela_preco_condicao, String ls_id_tipo_regime, Integer li_cd_cliente) {
super(context, resource, objects);
ctx = context;
this.list_tabela_preco_condicao = list_tabela_preco_condicao;
this.inflater = LayoutInflater.from(context);
this.resourceId = resource;
this.ls_id_tipo_regime = ls_id_tipo_regime;
this.li_cd_cliente = li_cd_cliente;
DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator(',');
decimalFormatSymbols.setGroupingSeparator('.');
decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
repositorio = new Repositorio(ctx);
String s_id_margem = repositorio.Parametro_getValue("id_margem");
if(s_id_margem != null && s_id_margem.equals("S")){
id_margem = true;
}
String s_id_destaca_ipi = repositorio.Parametro_getValue("id_destaca_ipi");
if(s_id_destaca_ipi != null && s_id_destaca_ipi.equals("S")){
id_destaca_ipi = true;
}
for(Produto_Insercao p_i : objects){
if(p_i.getQt_pedida() == null || p_i.getQt_pedida() == 0d){
p_i.setId_selecionado(false);
p_i.setId_tabela_condicao_preco(-1);
p_i.setCd_tabela_preco_condicao(-1);
} else {
p_i.setId_selecionado(true);
}
}
caminho_foto = repositorio.Parametro_getValue("caminho_foto");
c_p_null = new Condicao_Preco();
c_p_null.setCd_condicao_preco(0);
c_p_null.setCd_tabela_preco_condicao(0);
c_p_null.setDs_condicao_preco("Selecione");
c_p_null.setId_promocao("N");
c_p_null.setId_fake(true);
}
private static class ViewHolder {
public int position;
public TextView cd_produto;
public TextView ds_produto;
public TextView ds_unidade;
public Button btn_vl_saldo;
public Spinner spn_tabela_condicao_preco;
public TextView vl_unidade_unitario;
public TextView vl_unitario;
public Button qt_produto_menos;
public Button qt_produto_mais;
public EditText_Decimal_TW qt_produto;
public TextView vl_total;
public Button btn_editar_produto;
public TextView vl_custo;
public TextView pr_ipi;
public ImageButton foto_produto;
public Button mais_opcoes;
}
@Override
public void notifyDataSetChanged() {
inNotify = true;
boolean b = false;
if(view_aux != null && view_aux.isPressed()){
b = true;
}
super.notifyDataSetChanged();
if(b){
view_aux.requestFocus();
view_aux.setPressed(true);
view_aux.setSelected(true);
}
inNotify = false;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final Produto_Insercao p = getItem(position);
if(p.getCd_tabela_preco_condicao() == -1){
p.setId_selecionado(false);
} else {
p.setId_selecionado(true);
}
if (convertView == null) {
convertView = inflater.inflate(resourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.cd_produto = (TextView) convertView.findViewById(R.id.cd_produto);
viewHolder.ds_produto = (TextView) convertView.findViewById(R.id.ds_produto);
viewHolder.ds_unidade = (TextView) convertView.findViewById(R.id.ds_unidade);
viewHolder.btn_vl_saldo = (Button) convertView.findViewById(R.id.btn_vl_saldo);
viewHolder.spn_tabela_condicao_preco = (Spinner) convertView.findViewById(R.id.spn_tabela_condicao_preco);
viewHolder.vl_unidade_unitario = (TextView) convertView.findViewById(R.id.vl_unidade_unitario);
viewHolder.vl_unitario = (TextView) convertView.findViewById(R.id.vl_unitario);
viewHolder.qt_produto_menos = (Button) convertView.findViewById(R.id.qt_produto_menos);
viewHolder.qt_produto_mais = (Button) convertView.findViewById(R.id.qt_produto_mais);
viewHolder.qt_produto = (EditText_Decimal_TW) convertView.findViewById(R.id.qt_produto);
viewHolder.vl_total = (TextView) convertView.findViewById(R.id.vl_total);
viewHolder.btn_editar_produto = (Button) convertView.findViewById(R.id.btn_editar_produto);
viewHolder.vl_custo = (TextView) convertView.findViewById(R.id.vl_custo);
viewHolder.pr_ipi = (TextView) convertView.findViewById(R.id.pr_ipi);
viewHolder.foto_produto = (ImageButton) convertView.findViewById(R.id.foto_produto);
viewHolder.mais_opcoes = (Button) convertView.findViewById(R.id.mais_opcoes);
boolean id_mobile_utiliza_valor_unitario = false;
String s_id_mobile_utiliza_valor_unitario = repositorio.Parametro_getValue("id_mobile_utiliza_valor_unitario");
if(s_id_mobile_utiliza_valor_unitario != null && s_id_mobile_utiliza_valor_unitario.equals("S")){
id_mobile_utiliza_valor_unitario = true;
}
if(!id_mobile_utiliza_valor_unitario){
viewHolder.vl_unidade_unitario.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 13);
viewHolder.mais_opcoes.setLayoutParams(ll);
} else {
LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 15);
viewHolder.mais_opcoes.setLayoutParams(ll);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Repeater qt_produto_menos_repeater = new Repeater(viewHolder.qt_produto_menos);
viewHolder.qt_produto_menos.setOnLongClickListener(qt_produto_menos_repeater);
Repeater qt_produto_mais_repeater = new Repeater(viewHolder.qt_produto_mais);
viewHolder.qt_produto_mais.setOnLongClickListener(qt_produto_mais_repeater);
if(p.isId_liberado()){
viewHolder.mais_opcoes .setVisibility(View.GONE);
viewHolder.qt_produto_menos .setVisibility(View.VISIBLE);
viewHolder.qt_produto_mais .setVisibility(View.VISIBLE);
viewHolder.qt_produto .setVisibility(View.VISIBLE);
viewHolder.spn_tabela_condicao_preco.setVisibility(View.VISIBLE);
viewHolder.vl_unidade_unitario .setVisibility(View.VISIBLE);
viewHolder.vl_unitario .setVisibility(View.VISIBLE);
viewHolder.vl_total .setVisibility(View.VISIBLE);
viewHolder.btn_editar_produto .setVisibility(View.VISIBLE);
} else {
viewHolder.mais_opcoes .setVisibility(View.VISIBLE);
viewHolder.qt_produto_menos .setVisibility(View.GONE);
viewHolder.qt_produto_mais .setVisibility(View.GONE);
viewHolder.qt_produto .setVisibility(View.GONE);
viewHolder.spn_tabela_condicao_preco.setVisibility(View.GONE);
viewHolder.vl_unidade_unitario .setVisibility(View.GONE);
viewHolder.vl_unitario .setVisibility(View.GONE);
viewHolder.vl_total .setVisibility(View.GONE);
viewHolder.btn_editar_produto .setVisibility(View.GONE);
p.setId_liberado(false);
}
viewHolder.mais_opcoes.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
p.setId_liberado(true);
notifyDataSetChanged();
}
});
viewHolder.position = position;
if(!inNotify)
new MyAsyncTask(position, viewHolder, convertView, p, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
if(p.getQt_pedida() != null && p.getQt_pedida() > 0d){
convertView.setBackgroundResource(R.color.DuaPi_Pressed);
} else {
convertView.setBackgroundResource(R.color.WhiteSmoke);
}
if(p.getVl_saldo() != null && p.getVl_saldo() > 0d){
viewHolder.cd_produto .setTextColor(Color.BLACK);
viewHolder.ds_produto .setTextColor(Color.BLACK);
viewHolder.ds_unidade .setTextColor(Color.BLACK);
viewHolder.btn_vl_saldo .setTextColor(Color.BLACK);
} else {
viewHolder.cd_produto .setTextColor(Color.RED);
viewHolder.ds_produto .setTextColor(Color.RED);
viewHolder.ds_unidade .setTextColor(Color.RED);
viewHolder.btn_vl_saldo .setTextColor(Color.RED);
}
if(highlight && position == linha_atual){
convertView.setBackgroundResource(R.color.DuaPi);
} else {
convertView.setBackgroundResource(R.drawable.listview_background);
}
return convertView;
}
private static class MyAsyncTask extends AsyncTask {
private int position;
private ViewHolder viewHolder;
private View convertView;
private Produto_Insercao p;
private List<Condicao_Preco> lista_tabela_preco_condicao;
private CustomAdapter_Produto_Insercao mAdapter;
private SpinnerAdapter_Condicao_Preco adapter;
public MyAsyncTask(int position, ViewHolder viewHolder, View convertView, Produto_Insercao p, CustomAdapter_Produto_Insercao mAdapter) {
this.position = position;
this.viewHolder = viewHolder;
this.convertView = convertView;
this.p = p;
this.mAdapter = mAdapter;
lista_tabela_preco_condicao = new ArrayList<Condicao_Preco>();
}
@Override
protected Object doInBackground(Object... params) {
if(p.isId_liberado()){
viewHolder.btn_editar_produto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
linha_atual = position;
view_atual = convertView;
if(listener_btn_editar_produto != null){
listener_btn_editar_produto.onClick(v);
}
}
});
viewHolder.qt_produto_menos.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
view_aux = viewHolder.qt_produto_menos;
Double qt_anterior = viewHolder.qt_produto.getValor_Double();
viewHolder.qt_produto.setValor(viewHolder.qt_produto.getValor_Double() - p.getFator_venda());
//verifica se o produto não está na lista de itens do pedido, se tiver não deixa zerar...
if(PedidoTabActivity2.find_produto_em_itens(p.getCd_produto())){
if(viewHolder.qt_produto.getValor_Double() <= 0d){
viewHolder.qt_produto.setValor(qt_anterior);
return;
}
}
if(viewHolder.qt_produto.getValor_Double() < 0d){
viewHolder.qt_produto.setValor(0d);
}
p.setQt_pedida(viewHolder.qt_produto.getValor_Double());
calculaInformacoes(false);
if(!atualizaFLEX(p, 30)){
viewHolder.qt_produto.setValor(qt_anterior);
p.setQt_pedida(qt_anterior);
atualizaFLEX(p, 10);
calculaInformacoes(false);
return;
}
}
});
viewHolder.qt_produto_mais.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
view_aux = viewHolder.qt_produto_menos;
Double qt_anterior = viewHolder.qt_produto.getValor_Double();
viewHolder.qt_produto.setValor(viewHolder.qt_produto.getValor_Double() + p.getFator_venda());
p.setQt_pedida(viewHolder.qt_produto.getValor_Double());
calculaInformacoes(false);
if(!atualizaFLEX(p, 30)){
viewHolder.qt_produto.setValor(qt_anterior);
p.setQt_pedida(qt_anterior);
atualizaFLEX(p, 10);
calculaInformacoes(false);
return;
}
}
});
lista_tabela_preco_condicao.add(c_p_null);
lista_tabela_preco_condicao.addAll(list_tabela_preco_condicao);
if(p.getId_promocao() < 1){
for(int i = 0; i < lista_tabela_preco_condicao.size(); i++){
if(lista_tabela_preco_condicao.get(i).getId_promocao().equals("S")){
lista_tabela_preco_condicao.remove(i--);
}
}
}
OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
selection(arg2);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
};
viewHolder.spn_tabela_condicao_preco.setOnItemSelectedListener(onItemSelectedListener);
adapter = new SpinnerAdapter_Condicao_Preco(ctx, android.R.layout.simple_spinner_item, lista_tabela_preco_condicao, ls_id_tipo_regime, p.getCd_tabela_preco(), p.getCd_produto(), li_cd_cliente);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
convertView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(!clickable){
return ;
}
linha_atual = position;
view_atual = convertView;
if(listener_convertView != null){
listener_convertView.onClick(v);
}
p.setId_liberado(true);
mAdapter.notifyDataSetChanged();
}
});
viewHolder.btn_vl_saldo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(ad_estoque != null){
return ;
}
ad_estoque = new Dialog_TW(ctx);
final Dialog_TW ad_estoque_temp = ad_estoque;
ad_estoque.setView(R.layout.layout_pedido_venda_tab_insercao_estoque);
ad_estoque.setTitle("Consulta de Estoque");
ad_estoque.setCancelable(false);
View view_estoque = ad_estoque.getView();
TextView ds_produto = (TextView) view_estoque.findViewById(R.id.ds_produto);
Button btn_ok = (Button) view_estoque.findViewById(R.id.btn_ok);
ListView lv_resultado = (ListView) view_estoque.findViewById(R.id.lv_resultado);
TextView vl_total = (TextView) view_estoque.findViewById(R.id.vl_total);
ds_produto.setText(p.toString());
btn_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ad_estoque_temp.getDialog(false, 50d).dismiss();
}
});
ad_estoque.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
ad_estoque = null;
if(CustomAdapter_Pedido_Venda_Pendente_Item_Rascunho.editar){
CustomAdapter_Pedido_Venda_Pendente_Item_Rascunho.editar = false;
}
}
});
Repositorio repositorio = new Repositorio(ctx);
List<Saldo_Estoque> lista_saldo_estoque = repositorio.generic_GetList(Saldo_Estoque.class,
"cd_produto = '" + p.getCd_produto() + "'",
null,
null,
null,
"cd_empresa asc",
false);
Double total = 0d;
for(Saldo_Estoque s_e : lista_saldo_estoque){
List<Empresa> lista_empresa = repositorio.generic_GetList(Empresa.class,
"cd_empresa = '" + s_e.getCd_empresa() + "'",
null,
null,
null,
null,
false);
Empresa e = null;
if(lista_empresa != null && lista_empresa.size() > 0){
e = lista_empresa.get(0);
s_e.setNm_reduzido(e.getNm_reduzido());
}
total += s_e.getQt_disponivel();
}
vl_total.setText(decimalFormat.format(total));
CustomAdapter_Estoque adapter_estoque = new CustomAdapter_Estoque(ctx, R.layout.layout_pedido_venda_tab_insercao_estoque_lista, lista_saldo_estoque).setHighlight(true);
lv_resultado.setAdapter(adapter_estoque);
ad_estoque.getDialog(false, 50d).show();
}
});
return null;
}
@Override
protected void onPostExecute(Object result) {
if(id_margem){
viewHolder.vl_custo.setVisibility(View.VISIBLE);
viewHolder.vl_custo.setText(p.getVl_custo_unitario() == null ? "-" : decimalFormat.format(p.getVl_custo_unitario()));
}
if(id_destaca_ipi){
viewHolder.pr_ipi.setVisibility(View.VISIBLE);
viewHolder.pr_ipi.setText(decimalFormat.format(p.getPr_ipi()));
}
if(caminho_foto != null && p.getId_foto() != null && p.getId_foto().equals("S")){
viewHolder.foto_produto.setVisibility(View.VISIBLE);
viewHolder.foto_produto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Util.carregar_foto_produto(p.getCd_produto(), p.getDs_produto(), p.getNm_foto(), ctx);
}
});
}
viewHolder.cd_produto .setText(p.getCd_produto());
viewHolder.ds_produto .setText(p.getDs_produto());
viewHolder.ds_unidade .setText(p.getDs_unidade_unitaria());
viewHolder.btn_vl_saldo.setText(decimalFormat.format(p.getVl_saldo()));
if(p.isId_liberado()){
if(p.isId_selecionado()){
Unidade u = null;
List<Unidade> lista_Unidade = repositorio.generic_GetList(Unidade.class,
"cd_unidade = " + p.getCd_unidade_embalagem(),
null,
null,
null,
null,
false);
if(lista_Unidade != null && lista_Unidade.size() > 0){
u = lista_Unidade.get(0);
}
Double vl_unidade_unitario = Util.roundDouble(p.getVl_unitario() / (u != null ? u.getFator_conversao() : 1), 2);
viewHolder.vl_unidade_unitario.setText(decimalFormat.format(vl_unidade_unitario));
viewHolder.vl_unitario.setText(decimalFormat.format(p.getVl_unitario()));
viewHolder.vl_total .setText(decimalFormat.format(p.getVl_total()));
} else {
viewHolder.vl_unidade_unitario.setText(" - ");
viewHolder.vl_unitario .setText(" - ");
viewHolder.vl_total .setText(" - ");
}
viewHolder.qt_produto.setValor(p.getQt_pedida() == null ? 0d : p.getQt_pedida());
viewHolder.spn_tabela_condicao_preco.setAdapter(adapter);
if(lista_tabela_preco_condicao.size() > 1){
viewHolder.spn_tabela_condicao_preco.setEnabled(true);
} else {
viewHolder.spn_tabela_condicao_preco.setEnabled(false);
}
if(p.isId_selecionado()){
viewHolder.spn_tabela_condicao_preco.setSelection(find_Condicao_Preco_position(lista_tabela_preco_condicao, p.getCd_tabela_preco_condicao()));
} else {
viewHolder.spn_tabela_condicao_preco.setSelection(0);
}
if(lista_tabela_preco_condicao == null || lista_tabela_preco_condicao.size() < 2){
viewHolder.btn_editar_produto.setEnabled(false);
} else {
viewHolder.btn_editar_produto.setEnabled(true);
}
if(!p.isId_selecionado() && lista_tabela_preco_condicao.size() == 3){
adapter.getDropDownView(2, null, null);
viewHolder.spn_tabela_condicao_preco.setSelection(2);
}
}
convertView.setClickable(true);
convertView.setFocusable(true);
}
private Double calculaInformacoes_getVl_unitario(){
[ONLY CALCULATES THE VALUES]
}
private void calculaInformacoes(boolean calcula_Preco){
[ONLY CALCULATES THE VALUES]
}
private boolean atualizaFLEX(Produto_Insercao p_i, int operacao) {
[ONLY CALCULATES THE VALUES]
}
public Condicao_Preco find_Condicao_Preco(List<Condicao_Preco> lista, Integer cd_tabela_preco_condicao){
for(Condicao_Preco c_p : lista){
if(c_p.getCd_tabela_preco_condicao().equals(cd_tabela_preco_condicao)){
return c_p;
}
}
return null;
}
public Integer find_Condicao_Preco_position(List<Condicao_Preco> lista, Integer cd_tabela_preco_condicao){
for(int i = 0; i < lista.size(); i++){
Condicao_Preco c_p = lista.get(i);
if(c_p.getCd_tabela_preco_condicao().equals(cd_tabela_preco_condicao)){
return i;
}
}
return null;
}
public void selection(Integer arg2){
if(arg2 > 0){
Condicao_Preco c_p = find_Condicao_Preco(lista_tabela_preco_condicao, p.getCd_tabela_preco_condicao());
Condicao_Preco c_p_aux = lista_tabela_preco_condicao.get(arg2);
if(c_p == null || !c_p.getCd_tabela_preco_condicao().equals(c_p_aux.getCd_tabela_preco_condicao())){
if(p.getId_gera_flex().equals("S") && c_p_aux.getDs_condicao_preco().equals("Última Venda")){
if(c_p_aux.getDs_condicao_preco().equals("Última Venda")){
Util.MessageDialog_Ok(ctx,
ctx.getResources().getString(R.string.titulo_dialog_padrao),
"Produto que gera FLEX não pode ser selecionado 'Última Venda'.", Util.ICONE_INFORMATION);
}
p.setCd_tabela_preco_condicao(p.getCd_tabela_preco_condicao());
mAdapter.notifyDataSetChanged();
return;
}
if(c_p_aux.getVl_valor() != null){
p.setCd_tabela_preco_condicao(c_p_aux.getCd_tabela_preco_condicao());
p.setId_selecionado(true);
calculaInformacoes(true);
} else {
Util.MessageDialog_Ok(ctx,
ctx.getResources().getString(R.string.titulo_dialog_padrao),
"Não foi possível encontrar a última venda deste item para este cliente.", Util.ICONE_INFORMATION);
p.setCd_tabela_preco_condicao(p.getCd_tabela_preco_condicao());
mAdapter.notifyDataSetChanged();
}
}
} else {
p.setCd_tabela_preco_condicao(-1);
p.setId_selecionado(false);
calculaInformacoes(true);
}
}
}
}
敬具、
ウィリアム・バータン