0

Ich weiß nicht, warum meine Ausgabe von Listview immer in der falschen Reihenfolge, nachdem ich die Daten in meiner Tätigkeit aktualisieren.ListView nicht folgen Reihenfolge nach notifyDataSetChanged

Dies ist, wie ich den Adapter in meiner Tätigkeit

inboxTradeAdapter=new InboxTradeAdapter(InboxTradeActivity.this, R.layout.activity_inbox_trade, tradeArrayList,loginUserId); 
tradeList.setAdapter(inboxTradeAdapter); 

I

inboxTradeAdapter.notifyDataSetChanged(); 

nach tradeArrayList aktualisiert

Dieser Aufruf initialisiert ist mein Adapter

public class InboxTradeAdapter extends ArrayAdapter<Trade> { 
private List<Trade> tradeList; 
private Context context; 
private String loginUserId; 

public InboxTradeAdapter(Context context, int resource, List<Trade> tradeList, String loginUserId) { 
    super(context, resource, tradeList); 
    this.context = context; 
    this.tradeList = tradeList; 
    this.loginUserId=loginUserId; 
} 

@Override 
public boolean isEnabled(int position) { 
    return true; 
} 

@Override 
public int getCount() { 
    return ((null != tradeList) ? 
      tradeList.size() : 0); 
} 

@Override 
public Trade getItem(int position) { 
    return ((null != tradeList) ? 
      tradeList.get(position) : null); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    LayoutInflater layoutInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (null == view) { 
     view = layoutInflater.inflate(R.layout.grid_category, null); 
    } 

    final Trade trade = tradeList.get(position); 

    if (trade != null) { 
     final CardView tradeLayout = (CardView) view.findViewById(R.id.category_gridlayout); 
     final TextView tradeName = (TextView) view.findViewById(R.id.category_name); 
     final ImageView tradeImage = (ImageView) view.findViewById(R.id.category_icon); 

     tradeName.setText(trade.getNameOwn()); 
     tradeName.setSelected(true); 

     tradeLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show(); 
       Intent intent = new Intent(context, InboxActivity.class); 
       intent.putExtra("loginUserId", loginUserId); 
       intent.putExtra("tradeId",String.valueOf(trade.getId())); 
       context.startActivity(intent); 
      } 
     }); 
    } 

    return view; 
} 
} 

Ich kann bestätigen, dass die Order "tradeArrayList" in meiner Aktivität korrekt ist, aber die Listview zeigt den Trade in zufälliger Reihenfolge an. Ich kann den Fehler nicht finden, bitte helfen Sie

+0

Was ist nicht in Ordnung? Nur der Name oder beides, Name und Symbol? – W0rmH0le

+0

@ W0rmH0le zeigt die Listenansicht in zufälliger Reihenfolge an. Zum Beispiel, erstmalige Anzeige 1,2,3. Dann laufe ich nochmal, es wird 2,3,1 und so weiter angezeigt – phoon

Antwort

0

ich die Lösung gefunden haben, einen Blick Halter in Adapter erstellen und einen Setter erstellen die TRADE vor rufen Sie die notifyDataSetChanged()

Diese setzen ist meine Antwort

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    final Trade trade = tradeList.get(position); 
    Log.d("worked",position+": "+trade.getId()); 

    LayoutInflater layoutInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.list_trade, parent, false); 
     holder = new ViewHolder(); 
     holder.tradeName = (TextView) convertView.findViewById(R.id.trade_name); 
     holder.tradeLayout = (CardView) convertView.findViewById(R.id.trade_listlayout); 
     holder.tradeImage = (ImageView) convertView.findViewById(R.id.trade_icon); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    if (trade != null) { 

     holder.tradeName.setText(trade.getNameOwn()); 
     holder.tradeName.setSelected(true); 

     try { 
      Picasso.with(context) 
        .load(trade.getImageOwnOne()) 
        .error(R.drawable.ic_menu_camera) 
        .resize(200, 200) 
        .into(holder.tradeImage); 
     }catch(Exception e){ 
      holder.tradeImage.setImageResource(R.drawable.ic_menu_camera); 
     } 
     holder.tradeImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show(); 
       Intent intent = new Intent(context, DisplayTradeActivity.class); 
       Bundle bundle = new Bundle(); 
       bundle.putParcelable("trade", trade); 
       intent.putExtras(bundle); 
       context.startActivity(intent); 
      } 
     }); 
     holder.tradeLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show(); 
       Intent intent = new Intent(context, InboxActivity.class); 
       intent.putExtra("loginUserId", loginUserId); 
       intent.putExtra("tradeId",String.valueOf(trade.getId())); 
       context.startActivity(intent); 
      } 
     }); 
    } 

    return convertView; 
} 

public void setTradeList(ArrayList<Trade> tl) { 
    this.tradeList = tl; 
} 

static class ViewHolder { 
    private TextView tradeName; 
    private CardView tradeLayout; 
    private ImageView tradeImage; 
} 
0

Ich bemerkte, dass Sie kein Halter Muster verwenden. Nutze es immer zur Optimierung. Um das Problem zu umgehen, versuchen Sie, Ihren Code mit dem Halter Muster Refactoring. Sie können online mehr darüber erfahren.

Die Methode getItem() muss nicht außer Kraft gesetzt werden.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 
    Trade trade = getItem(position); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.grid_category, parent, false); 
     holder = new ViewHolder(); 
     holder.tradeName = (TextView) convertView.findViewById(R.id.category_name); 
     holder.tradeLayout = (CardView) convertView.findViewById(R.id.category_gridlayout); 
     holder.tradeImage = (ImageView) convertView.findViewById(R.id.category_icon); 
     convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

    holder.tradeName.setText(trade.getNameOwn()); 
    holder.tradeName.setSelected(true); 

    holder.tradeLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show(); 
      Intent intent = new Intent(context, InboxActivity.class); 
      intent.putExtra("loginUserId", loginUserId); 
      intent.putExtra("tradeId",String.valueOf(trade.getId())); 
      context.startActivity(intent); 
      } 
     }); 
    }       

    return convertView; 
    } 
}  

Ihre viewholder Klassencode:

static class ViewHolder { 
     private TextView tradeName; 
     private TextView tradeLayout; 
     private ImageView tradeImage; 
    } 
+0

Wie initialisiere ich mInflater? – phoon

+0

sogar ich benutze ViewHolder Design, listview Anzeige in randam Reihenfolge auch – phoon

Verwandte Themen