2016-11-03 1 views
0

Я не знаю, почему, но мой список не обновляется ... Я вызываю notifyDataSetChanged(), и я также попробовал другой ответ, где они просили сделать это :Мой список не обновляется даже после вызова notifydatasetchanged()

private void editTransaction(int position) { 
    h = historyItems.get(position); 
    historyItems.remove(position); 
    this.position = position; 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == 5 && resultCode == RESULT_OK) { 
     String description = data.getStringExtra("description"); 
     if (description == null) description = "no description"; 

     double amount = Double.parseDouble(data.getStringExtra("amount")); 

     h.setDescription(description); 
     h.setAmount(amount); 
     //h.setTimestamp(System.currentTimeMillis()); 

     //this is where I am updating my arraylist.... 

     historyItems.add(position,h); 
     adapter.notifyDataSetChanged(); 


     user.makeEdit(h); 

    } 
} 

это в моем обычном адаптере.

public class HistoryCustomAdapter extends BaseAdapter { 

Context context; 
ArrayList<HistoryItem> historyItems; 
HashMap<String,String> iconMapper; 

private static LayoutInflater inflater=null; 

public HistoryCustomAdapter(Context context, ArrayList<HistoryItem> historyItems, HashMap<String, String> iconMapper) { 
    this.context=context; 
    this.historyItems=historyItems; 
    this.iconMapper=iconMapper; 
    inflater = (LayoutInflater)context. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public Object getItem(int position) { 
    return historyItems.get(position); 
} 

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

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

    Holder holder; 
    if (convertView == null) { 
     holder = new Holder(); 
     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = vi.inflate(R.layout.history_item, parent, false); 

     holder.tvCat = (TextView)convertView.findViewById(R.id.tv_category); 
     holder.tvAmt = (TextView)convertView.findViewById(R.id.tv_amount); 
     holder.tvDate = (TextView)convertView.findViewById(R.id.tv_date); 
     holder.img = (ImageView)convertView.findViewById(R.id.iv); 
     convertView.setTag(holder); 

    } 

    holder=(Holder)convertView.getTag(); 
    HistoryItem historyItem; 
    historyItem = historyItems.get(position); 

    holder.tvCat.setText(historyItem.getCategory()); 
    holder.tvAmt.setText(historyItem.getAmount()+""); 

    DateFormat df = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss"); 
    Calendar c = Calendar.getInstance(); 
    c.setTimeInMillis(historyItem.getTimestamp()); 
    Date day  = c.getTime(); 

    holder.tvDate.setText(df.format(day)); 

    Resources res = context.getResources(); 
    String mDrawableName = iconMapper.get(historyItem.getCategory()); 
    int resID = res.getIdentifier(mDrawableName , "drawable", context.getPackageName()); 
    holder.img.setImageResource(resID); 

    return convertView; 
} 

public void refresh(ArrayList<HistoryItem> historyItems) 
{ 
    this.historyItems.clear(); 
    this.historyItems.addAll(historyItems); 
    //notifyDataSetChanged(); 
} 

public class Holder 
{ 
    TextView tvCat,tvAmt,tvDate; 
    ImageView img; 
} 

} 

Я не знаю, почему мой список не обновляется сразу ... Должен ли я переключиться на ArrayAdapters?

+0

Является ли этот класс ArrayAdapter? Если это так, используйте 'adapter.addAll' вместо вашего метода обновления. –

+0

Это не сработало ... это дало мне ясный экран –

+0

public void refresh (ArrayList historyItems) { this.historyItems.clear(); this.historyItems = historyItems; notifyDataSetChanged(); } –

ответ

1

Попробуйте удалить this.historyItems, затем this.historyItems.addAll(historyItems). Надеюсь, что это работает!

В любом случае, если вы пытаетесь ViewHolder шаблон, вы должны использовать его:

if (rowView == null) { 
    // init view, holder 
    rowView.setTag(holder) 
} else { 
    holder = (Holder) rowView.getTag(); 
} 

// fill data 

может быть, его причина, почему ваш ListView техника его подводит отражают немедленно.

+0

Это тоже не сработало ... Это дает мне пустой экран ... –

+0

public void refresh (ArrayList historyItems) { 1 this.historyItems .Чисто(); this.historyItems.addAll (historyItems); notifyDataSetChanged(); } –

+0

имеет ли ваш статус paramItems данные? – linhtruong

1

Когда вы назначаете новый ArrayList this.historyItems, данные больше не могут быть уведомлены, потому что вы потеряли ссылку на Arraylist, который вы указали изначально.

Если вы хотите, чтобы этот метод работал, вам необходимо переопределить getCount и getItem.

Но вы также должны

this.historyItems.clear(); 
this.historyItems.addAll(historyItems); 

Или, если с помощью ArrayAdapter, вам не нужен список в качестве переменной-члена

clear(); 
addAll(historyItems); 

Затем notifyDatasetChanged должен работать

+0

Я делаю это: this.historyItems.clear(); this.historyItems.addAll (historyItems); Кроме того, getCount и getItem переопределены ... –

+0

@Override public int getCount() { return historyItems! = Null? historyItems.size(): 0; } public Object getItem (int position) { return historyItems.get (position); } –

+0

Выглядит хорошо для меня. Чтобы остановить нас от угадывания проблем, вы должны показать [mcve] в своем сообщении –

0

Попытаться связаться с .setAdapter(adapter)adapter.notifyDataSetChanged();

0

Пожалуйста, проверьте этот метод

public void refresh(ArrayList<HistoryItem> historyitems) 
{ 
    this.historyItems=historyitems; 
    notifyDataSetChanged(); 
} 

Сделайте это. Он будет работать

 Смежные вопросы

  • Нет связанных вопросов^_^