2015-05-15 2 views
2

Мой ListView не обновится после ввода новых данных. Он будет обновляться только при изменении вкладок. Я положил notifyDataSetChange(), но он все еще не работает. Помогите!Мой список не обновляется во фрагменте

public class Tab4 extends Fragment { 

TextView title; 
TextView DateTitle; 
TextView AmountTitle; 
TextView DescTitle; 
ListView ExpensesList; 
List<Expenses> Expenses; 
Expenses expenses; 
ExpensesListAdapter adapter; 
Toast mToast; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 

    View rootView = inflater.inflate(R.layout.tab4, container, false); 

    title = (TextView) rootView.findViewById(R.id.Title); 
    DateTitle = (TextView) rootView.findViewById(R.id.DateTitle); 
    AmountTitle = (TextView) rootView.findViewById(R.id.AmountTitle); 
    DescTitle = (TextView) rootView.findViewById(R.id.DescTitle); 
    ExpensesList = (ListView) rootView.findViewById(R.id.ExpensesList); 

    Expenses = new ArrayList<Expenses>(); 
    expenses = new Expenses(); 
    mToast = Toast.makeText(getActivity().getApplicationContext(), "", 
      Toast.LENGTH_SHORT); 
    ExpensesList.setAdapter(adapter); 
    adapter = new ExpensesListAdapter(
      getActivity().getApplicationContext(), Expenses); 

    if (expenses.getAllExpenses().size() == 0) { 
     title.setText("Total number of record is 0"); 
     DateTitle.setVisibility(View.GONE); 
     AmountTitle.setVisibility(View.GONE); 
     DescTitle.setVisibility(View.GONE); 
    } else { 
     for (int i = 0; i < expenses.getAllExpenses().size(); i++) { 
      Expenses.add(expenses.getAllExpenses().get(i)); 
      System.out.println("Expenses are " 
        + expenses.getAllExpenses().get(i)); 

      adapter.notifyDataSetChanged(); 
      ExpensesList.invalidateViews(); 
     } 
     title.setText("Total number of record is " 
       + expenses.getAllExpenses().size()); 
    } 

    ExpensesList.setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, 
       final int position, long id) { 
      // TODO Auto-generated method stub 
      AlertDialog.Builder builder = new AlertDialog.Builder(
        getActivity()); 
      builder.setMessage("ARE YOU SURE YOU WANT TO DELETE THIS RECORD?"); 
      builder.setCancelable(false); 
      builder.setPositiveButton("Yes", 
        new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface dialog, 
           int which) { 
          // TODO Auto-generated method stub 
          expenses = new Expenses(); 
          expenses = expenses.getAllExpenses().get(
            position); 
          expenses.delete(); 
          Expenses.remove(position); 
          adapter.notifyDataSetChanged(); 


          title.setText("Total number of record is " 
            + expenses.getAllExpenses().size()); 

          mToast.setText("Record has been deleted"); 
          mToast.show(); 
         } 
        }); 

      builder.setNegativeButton("No", 
        new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface dialog, 
           int which) { 
          // TODO Auto-generated method stub 
          dialog.dismiss(); 
         } 
        }); 

      builder.show(); 
      return false; 
     } 
    }); 

    return rootView; 
} 
} 


class ExpensesListAdapter extends BaseAdapter { 

List<Expenses> Expenses; 
Context context; 
LayoutInflater inflater; 

public ExpensesListAdapter(Context context, List<Expenses> Expenses) { 
    this.context = context; 
    this.Expenses = Expenses; 

    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return Expenses.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public class Holder { 
    TextView Date; 
    TextView Amount; 
    TextView Desc; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    Holder holder = new Holder(); 
    convertView = inflater.inflate(R.layout.listview_expenseslist, null); 

    holder.Date = (TextView) convertView.findViewById(R.id.ExpensesDate); 
    holder.Amount = (TextView) convertView 
      .findViewById(R.id.ExpensesAmount); 
    holder.Desc = (TextView) convertView.findViewById(R.id.ExpensesDesc); 

    holder.Date.setText(Expenses.get(position).Date); 
    holder.Amount.setText(String.valueOf(Expenses.get(position).Amount)); 
    holder.Desc.setText(Expenses.get(position).Desc); 

    return convertView; 
} 

} 

ответ

0

Мой ListView не будет обновляться после я ключ в новых данных. Это будет только обновить, если я меняю вкладки.

Becuase в настоящее время добавляет новые данные в Expenses ArrayList.

Чтобы обновить новый элемент в адаптере ListView, необходимо добавить элемент в data-sorcude, который используется внутри адаптера для получения данных и метода getCount`.

для того чтобы достигнуть же создать метод в ExpensesListAdapter:

public void addAllItem(List<Expenses> strItem){ 
    this.Expenses.addAll(strItem); 
    this.notifyDataSetChanged(); 
} 

Позовите addNewItem метод, чтобы добавить новый элемент, когда AlertDialog положительный щелчок кнопки:

adapter.addNewItem(expenses.getAllExpenses()); 
+0

Спасибо за помощь! –

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