2017-02-23 10 views
0

私はスピナー項目の選択でリストビューをリフレッシュしようとしています。私は解決策がたくさんあることを知っているが、私はそれを解決することができませんでした。私はnotifyDataSetChanged()を試みたが、それは動作していません。 私はアンドロイドの新機能です。私を助けてください、私はそれに固執しています。ここでアンドロイドのスピナー選択でリストビューをリフレッシュする方法

私のアダプタクラスです:

public class ListDataAdaptar extends ArrayAdapter { 

List<DataProvider> mlist; 

public ListDataAdaptar(Context context, int resource,List<DataProvider> list) { 
    super(context, resource); 
    mlist=list; 
} 
static class LayoutHandler{ 
    TextView amount,date,title; 
    TextView total; 
} 

@Override 
public int getCount() { 
    return mlist.size(); 
} 

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

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View mView= convertView; 
    LayoutHandler layoutHandler; 
    if (mView==null) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mView=layoutInflater.inflate(R.layout.display_income_row,parent,false); 
     layoutHandler=new LayoutHandler(); 
     layoutHandler.title= (TextView) mView.findViewById(R.id.income); 
     layoutHandler.amount=(TextView)mView.findViewById(R.id.income_amount); 
     layoutHandler.date= (TextView) mView.findViewById(R.id.date); 
     mView.setTag(layoutHandler); 
    } 
    else { 
     layoutHandler = (LayoutHandler) mView.getTag(); 
    } 
    DataProvider dataProvider = (DataProvider)this.getItem(position); 
    Double s= new Double(dataProvider.getMoney()); 
    layoutHandler.amount.setText(""+s); 
    layoutHandler.date.setText(dataProvider.getDate()); 
    layoutHandler.title.setText(dataProvider.getName()); 

    return mView; 
} 
} 

そして、このクラスでは、私はスピナー使用しています:

public class IncomeReport extends AppCompatActivity { 
ListView list; 
Toolbar toolbar; 
private DatabaseHandler handler; 
private List<DataProvider> amountList; 
private ListDataAdaptar listDataAdapter; 
Spinner spinner; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.income_report); 
    toolbar = (Toolbar) findViewById(R.id.app_bar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    list = (ListView)findViewById(R.id.listView); 
    amountList = new ArrayList<>(); 
    handler = new DatabaseHandler(this); 

} 

public List getMonthItem() { 
    Cursor cursor = handler.displayIncomeMonthReport(); 
    if (cursor.moveToFirst()) { 
     do { 
      double amount; 
      String payer; 
      String note; 
      String date; 
      amount = Double.parseDouble(cursor.getString(cursor.getColumnIndex(handler.AMOUNT))); 
      payer = cursor.getString(cursor.getColumnIndex(handler.PAYER_NAME)); 
      note = cursor.getString(cursor.getColumnIndex(handler.NOTE)); 
      date=cursor.getString(cursor.getColumnIndex(handler.DATE)); 
      DataProvider provider = new DataProvider(amount, payer,note,date); 
      amountList.add(provider); 
      listDataAdapter = new ListDataAdaptar(this, R.layout.display_income_row, amountList); 
      list.setAdapter(listDataAdapter); 
      listDataAdapter.notifyDataSetChanged(); 

     } while (cursor.moveToNext()); 
     cursor.close(); 
     handler.close(); 
    } 
    return null; 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.spinner_menu, menu); 
    MenuItem item = menu.findItem(R.id.spinner); 
    spinner = (Spinner) MenuItemCompat.getActionView(item); 

    final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.report, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 
    final int number = getIntent().getExtras().getInt("pos1"); 
    spinner.setSelection(number); 

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long l) { 
      switch (pos){ 
       case (0): 
        getMonthItem(); 
        listDataAdapter.notifyDataSetChanged(); 
        break; 
       case (1): 
        getYearItem(); 
        listDataAdapter.notifyDataSetChanged(); 
        break; 
       default: 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) { 

     } 
    }); 
    return true; 
} 

}

答えて

0

まず、私はあなたがnew Adapterべきではないと言いたいですsetAdaptergetMonthItem()でも、do...whileであっても、onCreate()が良いです。次に、アイテムを選択すると、データリストが変更されたことを確認しますか?それをもう一度チェックしてください。

+0

はいアイテムを選択すると、データリストは変更されますが、古いデータの下に新しいデータが表示されます。古いデータはリストの一番上に新しいデータを表示するために – Rahid

+0

を削除しないで、このamountList.add(0、provider);を使用します。 – user2025187

+0

古いデータを消去して新しいデータをリストに再度追加しないでください。すべてのデータが完全に表示されます。 – xiaoyuan

関連する問題