2013-06-21 78 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

相关问题