2010-12-10 67 views
0

我有一個自定義列表視圖,其中顯示了每個列表項的名稱,日期和時間。 我有一個擴展BaseAdapter的適配器。 我想在數據庫中的數據發生變化時更新它。 這裏是我的代碼:在Android中更新自定義列表視圖

public class UpcomingReminders extends Activity { 

private Button addReminderButton; 
public static DataHelper dh; 
private ListView lv; 
private DataSetObserver observer; 
private EfficientAdapter adapter; 
private static class EfficientAdapter extends BaseAdapter implements Observer { 
    private LayoutInflater mInflater; 
    private String date; 
    private String time; 

      //This list has the data to be shown in the listview 
    private List <Reminder> upcomingReminders; 

      //not sure how to use these  
    private final DataSetObservable mDataSetObservable = new DataSetObservable(); 

    public void registerDataSetObserver(DataSetObserver observer) { 
      mDataSetObservable.registerObserver(observer); 
    } 
    public void notifyDataSetChanged() { 
     mDataSetObservable.notifyChanged(); 
    } 

    public EfficientAdapter(Context context) { 
       //This will populate the list to be shown 
     upcomingReminders = dh.selectAllUpcoming(); 
     mInflater = LayoutInflater.from(context); 
    }  
    public int getCount() { 
     // TODO Auto-generated method stub 
     return upcomingReminders.size(); 
    }  
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.upcominglistview, null); 
      holder = new ViewHolder(); 
      holder.reminderName = (TextView) convertView.findViewById(R.id.nameUpcoming); 
      holder.reminderDate = (TextView) convertView.findViewById(R.id.dateUpcoming); 
      holder.addedBy = (TextView) convertView.findViewById(R.id.AddedByUpcoming); 
      holder.reminderTime = (TextView) convertView.findViewById(R.id.timeUpcoming); 
      convertView.setTag(holder); 
      } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     String str = upcomingReminders.get(position).getReminderName(); 
     holder.reminderName.setText(str); 
     Calendar d = Calendar.getInstance(); 
     d = upcomingReminders.get(position).getReminderDateAndTime(); 
     date = ""+d.get(Calendar.MONTH)+"/"+d.get(Calendar.DAY_OF_MONTH)+"/"+d.get(Calendar.YEAR); 
     holder.reminderDate.setText(date); 
     time = ""+d.get(Calendar.HOUR_OF_DAY)+":"+d.get(Calendar.MINUTE); 
     holder.reminderTime.setText(time); 


     holder.reminderName.setOnClickListener(new textViewClickListener(position)); 
     holder.reminderDate.setOnClickListener(new textViewClickListener(position)); 

     return convertView; 
    } 
    class textViewClickListener implements OnClickListener { 
      int posit; 
      public textViewClickListener(int pos) 
       { 
        this.posit = pos; 
       } 
      public void onClick(View v) { 
       {// you can write the code what happens for the that click and 
       // you will get the selected row index in position 
        Bundle b = new Bundle(); 
        b.putString("title", upcomingReminders.get(posit).getReminderName()); 
        b.putString("date", date); 
        b.putString("time", time); 


        try { 
         Intent myIntent = new Intent(); 
         Context ctx = v.getContext(); 
         myIntent.setClass(ctx, ListItemDetails.class); 
         myIntent.putExtras(b); 
         ctx.startActivity(myIntent); 
       } catch (Exception e) { 
        // TODO: handle exception 
        Log.d("Activity call error:%s",e.getMessage()); 
       } 
      } 
      } 
    } 

    static class ViewHolder { 
     TextView reminderName; 
     TextView reminderDate; 
     TextView reminderTime; 
     TextView addedBy; 
    } 
    public void update(Observable observable, Object data) { 
     // TODO Auto-generated method stub 

    } 
} 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.dh = new DataHelper(this); 
     setContentView(R.layout.upcoming); 
     lv = (ListView)findViewById(R.id.list); 
    adapter = new EfficientAdapter(this); 
    lv.setAdapter(adapter); 

     //--------------------------------------- 
     this.addReminderButton = (Button)findViewById(R.id.AddButton); 
     this.addReminderButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent i = new Intent(); 
       i.setClass(v.getContext(),AddReminderInfo.class); 
       startActivity(i); 
      } 
      }); 
    }  

    @Override 
    protected void onResume(){ 
     super.onResume(); 
     if(Globals.isReminderOK){ 
      Globals.isReminderOK = false; 
      Log.i("ReminderID",""+Globals.reminderID); 
      dh.updateRow(Globals.reminderID,1); 
      dh.selectAllUpcoming(); 

      adapter.notifyDataSetChanged(); 
     } 
    } 
} 

做一些改變後,我更新使用dh.upDateRow分貝。這將刪除當前顯示在列表中的一行。 如何更新列表視圖以顯示此更改?

非常感謝。

+0

請分享你的問題的解決方案.. – 2012-09-17 06:29:46

+0

你好,能否請您分享您的解決方案。 – 2015-05-20 12:51:41

回答

2

您是否試過撥打adapter.notifyDataSetChanged()?因爲我被困在同樣的情況