2013-06-21 79 views
0

我是Java和Android新手。我正在創建需要列表視圖的東西。列表視圖數據是根據在偏好窗口中設置的GPS座標來計算的。我的問題是,我輸入新的座標後,列表視圖數據並不反映這一點。設置後刷新ListView數據首選項雙填充

到目前爲止我試過了什麼?我觀看過Google I/O 2010視頻,並在onResume()期間使用notifyDataSetChanged()。

但是,當我這樣做時,列表視圖和它的頭被填充兩次。我究竟做錯了什麼?段代碼遵循

public class MainActivity extends Activity{ 
GPSTracker gps; 
Date yetzt = new Date();  
String locationName = ""; 
double latitude = 0; 
double longitude = 0; 
double elevation = 0; 

List<RowItem> rowItems; 
ListView listView; 
String tmp = ""; 
ItemListViewAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    rowItems = new ArrayList<RowItem>(); 

    // check if GPS enabled 
    if (gps.canGetLocation()) { 
     showInfo(); 
    } else { 
     // can't get location 
     // GPS or Network is not enabled 
     // Ask user to enable GPS/network in settings 
     gps.showSettingsAlert(); 
    } 
} 

private void showInfo() {  
    SharedPreferences sharedPrefs = PreferenceManager 
      .getDefaultSharedPreferences(this); 

    TimeZone tz = TimeZone.getDefault();   
    locationName = tz.getDisplayName(false, TimeZone.SHORT); 
    latitude = Float.parseFloat(sharedPrefs.getString("manual_fetch_lat", Double.toString(gps.getLatitude()))); 
    longitude = Float.parseFloat(sharedPrefs.getString("manual_fetch_long", Double.toString(gps.getLongitude())));  
    TimeZone timeZone = TimeZone.getTimeZone(tz.getID());  

    listView = (ListView) findViewById(R.id.list); 
    //add stuff into rowItems here 
    adapter = new ItemListViewAdapter(MainActivity.this, R.layout.listview_item_row, rowItems); 

    View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null); 

    TextView t = new TextView(this); 
    t = (TextView)header.findViewById(R.id.textView1); 
    if (t != null) { 
     t.setText("Demo"); 
    } 

    listView.addHeaderView(header); 
    listView.setAdapter(adapter); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    menu.add(Menu.NONE, 0, 0, R.string.preference_menu_title); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    adapter.notifyDataSetChanged(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case 0: 
     startActivity(new Intent(this, EditSettingsActivity.class)); 
     return true; 
    } 
    return false; 
} 

}

我ListViewAdapter如下

public class ItemListViewAdapter extends ArrayAdapter<RowItem> { 
private Context context; 

public ItemListViewAdapter(Context context, int resource, 
     List<RowItem> objects) { 
    super(context, resource, objects); 
    this.context = context; 
} 

/* private view holder class */ 
private class ViewHolder { 
    ImageView imageView; 
    TextView txtTitle; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    RowItem rowItem = getItem(position); 

    LayoutInflater mInflater = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.listview_item_row, null); 
     holder = new ViewHolder(); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
     convertView.setTag(holder); 
    } else 
     holder = (ViewHolder) convertView.getTag(); 

    holder.txtTitle.setText(rowItem.getTitle()); 
    holder.imageView.setImageResource(rowItem.getImageId()); 

    return convertView; 
} 

}

的ListView數據填充,如圖

 GeoLocation location = new GeoLocation(locationName, latitude, longitude, elevation, timeZone); 
    ComplexZmanimCalendar czc = new ComplexZmanimCalendar(location); 
    ComplexZmanimCalendar czcPrevious = new ComplexZmanimCalendar(location); 
    ComplexZmanimCalendar czcNight = new ComplexZmanimCalendar(location); 
    Calendar cal = Calendar.getInstance();  

    Toast.makeText(getApplicationContext(), "Section 1", Toast.LENGTH_LONG).show(); 
    //subtract one day from current date 
    cal.add(Calendar.DATE, -1); 
    czcPrevious.setCalendar(cal); 
    diff = czcPrevious.getSunset().getTime() - czcPrevious.getSunrise().getTime(); 
    interval = diff/12; 

    SimpleDateFormat parserSDF=new SimpleDateFormat("HH:mm"); 
    List<String> x = new ArrayList<String>(); 

    for(int counter=0; counter < 12; counter++){  


     tmp = "From "+ parserSDF.format(new Date(czcPrevious.getSunrise().getTime() + (counter*interval)))+" to "+parserSDF.format(new Date(czcPrevious.getSunrise().getTime() + ((counter+1)*interval))); 
     n = getResources().getIdentifier(logo[counter].toLowerCase(),"drawable", getPackageName()); 
     item = new RowItem(n, tmp); 
     rowItems.add(item);     
    }  

    diff = czc.getSunrise().getTime() - czcPrevious.getSunset().getTime(); 
    interval = diff/12; 

    for(int counter=0; counter < 12; counter++){     

     tmp = "From "+ parserSDF.format(new Date(czcPrevious.getSunset().getTime() + (counter*interval)))+" to "+parserSDF.format(new Date(czcPrevious.getSunset().getTime() + ((counter+1)*interval))); 
     n = getResources().getIdentifier(logo[counter].toLowerCase(),"drawable", getPackageName()); 
     item = new RowItem(n, tmp); 
     rowItems.add(item);    

    } 
+0

請張貼你的「ItemListViewAdapter」。 –

+0

@ larry-mckenzie完成。看到代碼的最後一個 – user1801060

+0

你有一個評論,你可以在其中設置「rowItems」,你可以填寫。 –

回答

1

我沒有看到任何你修改或填充任何值的數組「rowItems」的地方。

你可以發佈EditSettingsActivity,以便我們可以看到你在那裏做什麼?

到目前爲止,您可以修改這個代碼行:

TextView t = new TextView(this); 
t = (TextView)header.findViewById(R.id.textView1); 

...這個...一個

TextView t = (TextView)header.findViewById(R.id.textView1); 

我剛纔看到你的適配器和幾乎是完美的,我可以看到您在追蹤谷歌I/O,XD的谷歌視頻....只是讓你的適配器...

static class ViewHolder { 

EditSettingsActivity將有助於下站在您的應用程序的生命週期...但現在...

如果您的MainActivity取決於您在EditSettingsActivity上設置的某些值,那麼您必須將值返回到MainActivity以修改聲明的數組rowItems MainActivity和修改此數組後,您可以調用notifyDataSetChanged()。

您可以用startActivityForResult做到這一點,你可以在這裏找到它的工作原理:

aryo.info/blog/android-returning-value-to-the-calling.html

我不知道是什麼您在EditSettingsActivity上修改的值的類型,但您也可以將它們存儲在SharePreferences上,並在您返回時在MainActivity上檢索它們。 通過這種方式,用戶下次訪問應用程序時,他會保持上次設置的相同首選項,並且只有在您卸載應用程序時纔會刪除它們。

如何使用共享偏好:

http://developer.android.com/guide/topics/data/data-storage.html#pref

我剛纔說在這個環節,你想要做的是什麼的示例項目,它是工作:

https://dl.dropboxusercontent.com/u/33565803/StackOverFlowExamples/ListViewHeaderAddItemsNotifyDataExample.zip

+0

我已經更新了代碼列表和註釋掉的代碼 – user1801060

+0

您是否正在調用一個函數,其中的評論是所有這一切?你以後如何修改你的列表取決於用戶在設置中做些什麼? – jpardogo

+0

我在我的MainActivity中使用共享首選項。我使用EditSettingsActivity來允許用戶手動輸入GPS座標。這些被用在MainActivity中。請看看showinfo()的前6行。 – user1801060

相關問題