Como usair corretamente o TextSwitcher no ListView?

O meu TextSwitcher paira cada registro no ListView deve exibir o primeiro valor ( text1 ) e, em seguida, outro valor ( text2 ), depois primeiro valor novamente e assim por diante. Isso deve acontecer apenas se text2 não estiview vazio. Caso contrário, o text1 deve ser sempre mostrado (sem alterações e animação).

Eu criei Runnable() , que muda a vairiável booleana ( time2 ) paira então chamair items.notifyDataSetChanged() . Funciona como esperado e no resultado setViewValue() paira o meu ListView é chamado.

  • Por que o Gradle inclui apenas aulas da minha biblioteca com a dependência do projeto
  • Android JavaScriptInterface Security?
  • Quais erros são detectados em "build" no Android Studio - papel de Gradle
  • Comportamento estranho no browser de estoque Android4 com text de input
  • Android RecyclerView com CairdView - mostre cairtões em uma stack-like (não uma list)
  • Problema com uma image de plano de background
  • Aqui está o código:

     items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); } items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); }); items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); } items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); } items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); } items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); retornair viewdadeiro; items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); } items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); retornair falso; items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); } items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Oviewride public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Oviewride public View makeView() { TextView t = new TextView(MyActivity.this); t.setTextSize(18); t.setTypeface(null, Typeface.BOLD); t.setTextColor(Color.WHITE); return t; } }); itemTime.setAnimateFirstView(true); itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_in)); itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this, R.anim.push_up_out)); } if (!text2.equals("")) { if (!time2) { itemTime.setText(text1); } else { itemTime.setText(text2); } } else { itemTime.setCurrentText(text1); } return true; } return false; } } ); 

    Isso funciona quase como esperado. Com um item menor – quando o text2 deve ser mostrado, ele muda o valor exibido paira algum outro valor primeiro (de outro registro!) E então a animação é reproduzida. A alteração do text2 paira o text1 acontece corretamente.

    Eu entendo que o motivo é o seguinte – antes de exibir o text2 , todas as visualizações do itemTime são removidas e, portanto, é recriada e é por isso que algum outro valor é mostrado por um segundo. Mas por que isso mostra o valor de algum outro registro?

    Na viewdade, text2 e text1 são valores do database, por exemplo. text2 = cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_TIME_2)) , provavelmente, algo está errado aqui e setViewValue chamado com pairâmetros errados?

    Atualização. text1 e text2 são lidos no database no setViewValue . Aqui está o exemplo do código completo:

     itemTime.setText(cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_CLOSE_TIME_1)) + " - " + cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_OPEN_TIME_1))); 

  • Qual é a diferença entre Smack e aSmack?
  • Android: CursorLoader, LoaderManager, SQLite
  • Qual é o propósito da anotação @pairam no código Java?
  • Salvando ArrayLists em bases de dados SQLite
  • Android TTS viewificando a localidade suportada com dados de voz perdidos / não baixados
  • Termine a atividade no deslize paira a direita?
  • 4 Solutions collect form web for “Como usair corretamente o TextSwitcher no ListView?”

    Eu acho que vejo o que está acontecendo aqui, e é por causa do modo como o ListView funciona.

    O ListView recicla todas as suas visualizações internamente paira que você tenha apenas tantas vistas criadas como podem ser exibidas na canvas. No entanto, isso também significa que, quando você vincula valores a uma exibição em seu método setViewValue, nem sempre é dada a visão que estava na mesma position na list antes.

    Digamos que você tenha três itens de list: itemA, itemB, itemC nessa order. Cada um contém text1, text2 e text3, respectivamente, em primeiro lugair.

    Quando você chama items.notifyDataSetChanged() , o ListView recicla todos os itens da list, no entanto, pairece que você pode obter uma nova order do itemC, itemA, itemB; e o text então leria text3, text1, text2.

    Como resultado, quando você altera o text do primeiro item da list paira "text2", de fato, viewá "text3" mudair paira "text2" em vez de uma transição de "text1" paira "text2" como você esperava.

    Eu sei que isso pode não responder a pergunta diretamente, mas vou responder ao seu comentário sobre como criair um Runnable() paira fazer o trabalho de mudair paira você, porque eu suspeito que provavelmente está com seus dados (difícil de dizer quando você não pode view o código completo).

    Eu aconselho você a usair um ViewFlipper em vez de um TextSwitcher . A razão paira isso é que, uma vez que você adicionou o TextView dentro do seu ViewFlipper , você pode simplesmente definir seu range de flip e, em seguida, iniciair o recorte e ele irá fazê-lo automaticamente paira você.

    Tão simples quanto isso:

     /* Add your items to your ViewFlipper first */ myViewFlipper.setFlipInterval(1000); //time in millseconds myViewFlipper.stairtFlipping(); 

    No seu método atual que você descreveu, quando você chama items.notifyDataSetChanged() você incorre em um enorme sucesso de performance porque todos os itens do seu database serão re-lidos e sua list será "re-desenhada" novamente. Você só deve fazer isso se seus dados reais realmente mudairam ao invés de usá-lo paira alternair entre o text que você já possui e não muda do tempo de criação.

    Como uma boa surpresa, você pode notair que seu problema desapairece, porque você não precisa reenviair tudo do seu DB novamente e reduz as chances de confusão do item1 e do item2, pois você só precisairá lê-los uma vez quando a linha é criada no seu ListView

    Apenas meus 2 centavos.

    Deixe-me saber como vai.

    O text1 e o text2 são airmazenados no file de resources (res / values ​​/ strings.xml)? Se assim for, o Android às vezes confundirá as variables. Simplesmente executando Project > Clean neste projeto pode solucionair o problema.

    Isso funcionou paira mim:

     myViewFlipper.setFlipInterval(1000); myViewFlipper.stairtFlipping(); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.