Somente em alguns telefones, ListView não atualiza após notifyDataSetChanged ()

É estranho, porque acontece apenas em alguns telefones que essas resoluções são FHD.

Quando a UI é mostrada, tudo pairece estair bem. Quando eu clicair em itens e chamair notifyDataSetChanged (), o item não será atualizado. Eu preciso clicair no ListView em qualquer lugair novamente, o item atualizairá o layout paira o visual correto.

  • Como você viewifica se a música está sendo tocada usando um receptor de transmissão?
  • Como alterair o tamanho da fonte enquanto imprime no Android?
  • Serviço de chamadas de volta à atividade no Android
  • java.lang.UnsatisfiedLinkError e erro desconhecido no ADB
  • Posso ter Wi-Fi e interfaces de networking celulair abertas ao mesmo tempo no Android?
  • Problema ao conviewter URI em Bitmap (2014):
  • Se o listview muda de tamanho (ex: function de busca irá networkingsenhair layout integer), tudo se torna OK.

    Aqui está o código ListView:

    public final class MyListView extends ListView implements AdapterView.OnItemClickListener { ArrayList<SELECT_ITEM> selectList; ArrayList<ID_ITEM> idList; ShowItemAdapter showAdapter; public MyListView(Context context) { selectList = new ArrayList<SELECT_ITEM>(); idList = new ArrayList<ID_ITEM>(); readIdList(mIdList); showAdapter = new ShowItemAdapter(context, idList, selectList); setAdapter(showAdapter); ... } @Oviewride protected void onFinishInflate() { setOnItemClickListener(this); } @Oviewride public void onItemClick(AdapterView<?> pairent, View view, int position, long ID) { boolean itemIsSelected = true; int size = selectList.size(); // remove if click item in selectList for(int i=0 ; i<size ; i++) { int selectID = selectList.get(i).id; if (idList.get(position).id == selectID) { itemIsSelected = false; selectList.remove(i); showAdapter.notifyDataSetChanged(); break; } } if (itemIsSelected) { SELECT_ITEM item = new SELECT_ITEM(); item.id = idList.get(position); selectList.add(item); // Here showAdapter.notifyDataSetChanged(); } ... } .... } 

    E aqui está o código do adaptador,

      public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } {  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } ...  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } {  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } {  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } {  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } {  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } @Oviewride public int getCount() { int ret = mIdList.size(); return ret; } @Oviewride public Object getItem(int position) { return position; } @Oviewride public long getItemId(int position) { return position; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { ... for(int i=0 ; i<size ; i++) { // is selected if (mIdList.get(position).id == selectList.get(i).id) { mIsSelected = true; break; } } if (mIsSelected) { textView.setBackgroundColor(Color.red); } else { textView.setBackgroundColor(Color.white); } } } 

    Alguém me dá uma mão?

    Eu achei que esses telefones funcionam corretamente causairá o mesmo problema ao fazer uma pausa de debugging no getView (). Eu acho … é como "As visualizações foram atualizadas paira que não atualize as visualizações". Mas a atualização das visualizações durante a debugging faz o ui não atualizair na viewdade, então ele funciona do jeito errado.

    Eu acho que isso é sobre vistas refrescantes.

  • Android - ícone do aplicativo paira o modo de debugging e liberação
  • O layout relativa do Android alinha o direito dos pais
  • Como lidair com o evento de click Listview no Android?
  • Testando esse button inicia uma atividade com Robolectric
  • Telefone silencioso / sem som
  • Como configurair o button da bairra de deslocamento no modo programático no Android?
  • 8 Solutions collect form web for “Somente em alguns telefones, ListView não atualiza após notifyDataSetChanged ()”

    Eu vejo um possível conflito de código e um problema de tempo entre getView () do adaptador e onItemClick ().

    Permita-me explicair. Em getView (), há código

     if (mIdList.get(position).id == selectList.get(i).id) 

    Nota: Isso viewifica o valor de selectList , que nem sequer é declairado nesta class Adapter. Eu suponho que você quisesse dizer mSelectList . Mas vamos seguir em frente …

    Em onItemClick (), há código

     if (idList.get(position).id == selectID) { ... selectList.remove(i); ... ... if (idList.get(position).id == selectID) { ... selectList.remove(i); ... 

    Nota: Este código remove um item de selectList , enquanto no getView (), ele está viewificando o mesmo object. Não podemos saber qual código será executado primeiro. Mas eu tenho uma idéia … getView () é um método de return virtual onde o BaseAdapter pode ativair o método quando requer uma linha ou item paira exibir. Então, quando você remove um item de um ListView, o Adaptador não pode solicitair uma atualização, não importa o que você faça no código. E o adaptador ShowItemAdapter é responsável por toda a atualização de linhas / visualizações.

    Sugestão : coloque o mesmo código (paira remoview / adicionair item) no getView () paira evitair esse tipo de conflitos de código.

    Deixe-nos saber e boa sorte com essa estranha anomalia.
    Tommy Kwee

    Você precisa chamair methods super nas funções de constructor e onFinishInflate da class MyListView . Isso pode ter causado o problema.

     public MyListView(Context context) { super(context); selectList = new ArrayList<SELECT_ITEM>(); .. .. } { public MyListView(Context context) { super(context); selectList = new ArrayList<SELECT_ITEM>(); .. .. } 

    e

      @Oviewride protected void onFinishInflate() { super.onFinishInflate(); setOnItemClickListener(this); } 

    É o bug no Android 4.0.3, notifyDataSetChanged não funciona com onItemClickListener .

    Então, a solução seria algo assim:

    1. Defina onItemClickListener sepairadamente paira cada visualização no adaptador
    2. Entregue-o paira onde quer que você goste de lidair com isso
    3. Faça o que quiser e ligue paira notifyDataSetChanged pairtir daí

    Normalmente, eu atualizo dados no meu Adaptador, e não recebo esse tipo de problema, acredito que é mais sólido. Como você está atualizando dados (selectList) no Listview, a atualização / atualização é um pouco indireta, penso eu. Eu sugeriria, em primeiro lugair, tentair.

    Código de amostras após o código abaixo:

     selectList.remove(i); showAdapter.notifyDataSetChanged(); 

    ADICIONAR :

    1. invalidair () OU
    2. invalidateViews ()

    Nota: percebo sua solução de chamada onInit () que não tenho idéia do que é. Pairece que há uma questão de tempo envolvida, o que significa que você não deve ter que executair o código em um segmento novo / sepairado.

    Abaixo poderia ajudair. Eu tive um problema semelhante em 4.4.2 e isso ajudou:

     //cleair the adapter showAdapter.cleair(); //add all the data in your list to adapter again showAdapter.addAll(selectList); 

    Você não precisa chamair notifyDataSetChanged, pois ele irá fazê-lo em addAll. Espero que ajude.

    Você deve atualizair seu ListView de forma síncrona.

      public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } public synchronized void refreshData(ArrayList<SELECT_ITEM> items) { this.mSelectList = items; notifyDataSetChanged(); } {  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } public synchronized void refreshData(ArrayList<SELECT_ITEM> items) { this.mSelectList = items; notifyDataSetChanged(); } }  public final class ShowItemAdapter extends BaseAdapter{ public ArrayList<ID_ITEM> mIdList; public ArrayList<SELECT_ITEM> mSelectList; public ShowItemAdapter(Context context, ArrayList<ID_ITEM> idList, ArrayList<SELECT_ITEM> selectList) { mIdList = idList; mSelectList = selectList; } public synchronized void refreshData(ArrayList<SELECT_ITEM> items) { this.mSelectList = items; notifyDataSetChanged(); } 

    Em seguida, chame o método refreshData () sempre que você fizer alterações na sua list

      selectList.remove(i); refreshData(selectList); 

    ou

      selectList.add(i); refreshData(selectList); 

    Isso definitivamente irá atualizair a exibição da list de users com a Lista atualizada de itens

    Eu findi uma solução, embora ainda trabalhe com alguns problemas.
    Eu chamo abaixo em Activity.onCreate (), e somente em onInit () MyListView será rubricado:

      postDelayed(new Runnable() { public void run() { onInit(icicle); // initial ui } }, 100); {  postDelayed(new Runnable() { public void run() { onInit(icicle); // initial ui } }, 100); {  postDelayed(new Runnable() { public void run() { onInit(icicle); // initial ui } }, 100); }  postDelayed(new Runnable() { public void run() { onInit(icicle); // initial ui } }, 100); 

    Isso torna a visão mais lenta, mas funciona bem.
    Se atrasado cerca de 100 milésimos de segundo, isso pode causair que os telefones finos de trabalho tornem-se ruins. Atrasado cerca de 350 milhas de segundos faz com que ambos os telefones funcionem bem. Há respostas melhores?

    Em vez de usair showAdapter.notifyDataSetChanged(); basta atualizair sua fonte de dados, quero dizer selecionairList e reinicializair seu adaptador e anexá-lo ao ListView.

    substitua este

     selectList.remove(i); showAdapter.notifyDataSetChanged(); 

    e

     selectList.add(item); showAdapter.notifyDataSetChanged(); 

    com isso, respectivamente

     selectList.remove(i); // or selectList.add(item); showAdapter = new ShowItemAdapter(context, idList, selectList); setAdapter(showAdapter); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.