2011-09-01 100 views
0

我的ListFragment有两个问题: 我想刷新ListFragment,点击我在XML文件中定义的按钮。我最初在AsyncTask中加载DataAdapter的Data标题片段。2刷新ListFragment中的问题

我还没有找到一种方式来创建按钮的代码可以访问的AsyncTask - 并刷新我的TitlesFragment

在不同注:Listfragment自我更新,每次我换手机,的取向,这绝对不是理想的行为。

public class ClosestPlaces extends FragmentActivity { 

private static KantinenListe kantinen; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_ACTION_BAR);   
    setContentView(R.layout.kantinen_results); 

} 

/** 
* This is the "top-level" fragment, showing a list of items that the 
* user can pick. Upon picking an item, it takes care of displaying the 
* data to the user as appropriate based on the currrent UI layout. 
*/ 

public static class TitlesFragment extends ListFragment { 
    boolean mDualPane; 
    int mCurCheckPosition = 0; 


    private class BuildKantinen extends AsyncTask<String, Integer, KantinenListe> { 

     private KantinenListe kantinen; 


     @Override 
     protected KantinenListe doInBackground(String... params) { 
      try{ 

       Gson gson = new Gson();    
       // SOAP Test 
       String NAMESPACE = "http://tempuri.org/"; 
       String METHOD_NAME = "fullSyncGPS"; 
       String SOAP_ACTION = "http://tempuri.org/IDatenService/fullSyncGPS"; 
       String URL = "http://webserviceURL?wsdl"; 

       SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME); 

       PropertyInfo pi = new PropertyInfo(); 
       request.addProperty("radius",10); 
       request.addProperty("lat", "14.089201"); 
       request.addProperty("lng", "02.136459"); 
       request.addProperty("von", "01.09.2011"); 
       request.addProperty("bis", "01.09.2011"); 

       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
       envelope.dotNet = true; 
       envelope.setOutputSoapObject(request);   

       HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
       androidHttpTransport.call(SOAP_ACTION, envelope); 
       SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 

       String resultData = result.toString(); 


       resultData = "{\"meineKantinen\":"+resultData+"}"; 
       this.kantinen = gson.fromJson(resultData, KantinenListe.class); 
       Log.i("test", "blubber"); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
       return this.kantinen; 

     } 

     @Override 
     protected void onPostExecute(KantinenListe result) { 
      // populate the List with the data 
      Log.i("test", "postexecute"); 
      setListAdapter(new MenuAdapter(getActivity(), R.layout.simple_list_item_checkable_1, kantinen.getMeineKantinen())); 
     } 
    } 


    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     new BuildKantinen().execute("test");      

     if (savedInstanceState != null) { 
      // Restore last state for checked position. 
      mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("curChoice", mCurCheckPosition); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     showDetails(position);    
    } 

    /** 
    * Helper function to show the details of a selected item, either by 
    * displaying a fragment in-place in the current UI, or starting a 
    * whole new activity in which it is displayed. 
    */ 
    void showDetails(int index) { 
     mCurCheckPosition = index; 

      // Otherwise we need to launch a new activity to display 
      // the dialog fragment with selected text. 
      Log.i("Test",Integer.toString(index)); 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), BeAPartner.class); 
      startActivity(intent); 
    } 
} 

public static class MenuAdapter extends ArrayAdapter { 

    private LayoutInflater mInflater; 
    private List<Kantine> items; 
    private Context context; 

    public MenuAdapter(Context context, int textViewResourceId, List<Kantine> items) { 
     super(context, textViewResourceId); 
     mInflater = LayoutInflater.from(context); 
     this.items = items; 
     this.context = context; 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.menu_row, parent, false); 
      holder = new ViewHolder(); 
      holder.color = (TextView) convertView.findViewById(R.id.color); 
      holder.title = (TextView) convertView.findViewById(R.id.detail); 
      holder.subdetail = (TextView) convertView.findViewById(R.id.subdetail); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     // Fill in the actual story info 
     Kantine s = items.get(position); 

     s.setName(Html.fromHtml(s.getName()).toString()); 
     if (s.getName().length() > 35) 
      holder.title.setText(s.getName().substring(0, 32) + "..."); 
     else 
      holder.title.setText(s.getName()); 

     Log.i("display", "Here I am"); 
     return convertView; 
    } 


} 
    static class ViewHolder { 
     TextView color; 
     TextView title; 
     TextView subdetail; 
    } 

回答

5

那么要停止重新启动活动,您可以在运行该片段的活动上设置android:configChanges属性。

android:configChanges="orientation" 

该设置指示系统在方向更改时不重新启动活动以更改方向。

至于按钮,使用属性android:onClick =“myFunction”在XML中设置您的点击监听器。然后在你的片段定义此功能:

public void myFunction(View v) 
    { 
      new myAsync.execute('test');  
    } 
+0

ooo,感谢定位提示 – anakin78z

+0

这基本上意味着我需要创建一个“单个”异步类。因为我不能引用“子类”异步任务,对吗? 但是,如果不再是TitleFragment的子类,我就无法从原始FragmentActivity中引用“setListAdapter” – theXs

+0

如果您还有对外部类的引用,则可以引用子类。好的是FragmentActivity存储了一个给定片段的引用,您可以使用它来创建一个新的BuildKantinen异步对象。基本上像“fragmentReference.new BuildKantinen()。execute('test');”。 O也必须将片段引用转换为TitlesFragment,因为常规的ListFragment没有内部类BuildKantinen。 – Bobbake4

1

当您更改手机方向时,它会重新开始活动。任何需要持久化的东西都需要保存在onSaveInstanceState(Bundle savedInstanceState)中并使用onRestoreInstanceState(Bundle savedInstanceState)进行恢复。

就单击按钮时更新数据而言,请尝试调用适配器上的notifyDataSetChanged()。如果这不起作用,你可能只需要再次运行你的asynctask。

+0

但是我怎样才能调用片段外面的AsyncTask(基本上在活动中)? – theXs

+0

你需要以某种方式抓住片段。你是在布局文件中定义它的吗? 的例子,你会看到在onCreate方法是这样的: '如果(getSupportFragmentManager()findFragmentById(android.R.id.content)== NULL){' \t \t \t'ArrayListFragment列表=新ArrayListFragment();' \t \t \t'getSupportFragmentManager()调用BeginTransaction()加(android.R.id.content,列表).commit();在这种情况下' \t \t'}' ,名单'是对你的片段的引用,所以如果你的片段中有一个update()函数,你可以调用list.update() (抱歉关于格式化......无法找到它) ut) – anakin78z

+0

我创建了一个XML文件的片段。但我只是不能让所有这些方法工作:( – theXs

0

好吧,我认为这是张贴在一个新的答案一个可能的解决方案的最佳实践 - 对于可读性的原因很明显:

public void reload(View v) 
{ 
    if (getSupportFragmentManager().findFragmentById(R.id.titles) != null) { 
      Fragment titles = (ListFragment)getSupportFragmentManager().findFragmentById(R.id.titles); 
      //recreate the fragment 
      titles.onActivityCreated(null); 
    } 
} 

不正是我想要(重新加载数据)!但是......我认为这种解决方案的内存占用可能很差。

+0

重新创建片段似乎是矫枉过正。如果你有对你的片段的引用(在这个例子中是'title'),你应该能够调用其中的任何方法或函数。只需创建一个函数来重新查询数据并更新适配器。 – anakin78z

+0

事实上,如果您使用的是LoaderManager,您可以重新启动加载程序,但对于您的情况,您需要手动重新加载数据。 –