2015-01-16 110 views
0

完整的noob在這裏,請耐心等待。我有一個從我的服務器加載數據並在Listview中顯示它的活動。現在我需要能夠重新排列基於TabHost的列表。我使用MaterialTabHost(https://github.com/neokree/MaterialTabs從TabHost填充Listview片段

下面是我用它來填充ListView代碼:

listView = (ListView) findViewById(R.id.list); 
    adapter = new CustomListAdapter(this, movieList); 
    listView.setAdapter(adapter); 
    pDialog = new ProgressDialog(this); 
    // Showing progress dialog before making http request 
    pDialog.setMessage("Loading..."); 
    pDialog.show(); 
    // Creating volley request obj 
    final Double finalLat = lat; 
    final Double finalLon = lon; 
    final Double finalLat1 = lat; 
    final Double finalLon1 = lon; 
    JsonArrayRequest movieReq = new JsonArrayRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(final JSONArray response) { 
        Log.d(TAG, response.toString()); 
        hidePDialog(); 

        // Parsing json 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          viewer movie = new viewer(); 
          LatLng point1 = new LatLng(obj.getDouble("lat"), obj.getDouble("long")); 
          LatLng point2 = new LatLng(finalLat, finalLon); 
          distanceInMiles = LatLngTool.distance(point1, point2, LengthUnit.MILE); 
          movie.setTitle(obj.getString("first_name")); 
          movie.setThumbnailUrl(obj.getString("pic")); 
          //movie.setRating(((String) obj.getString("experience"))); 
          movie.setYear(Double.parseDouble(String.format("%.2f", distanceInMiles))); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 

        // notifying list adapter about data changes 
        // so that it renders the list view with updated data 
        adapter.notifyDataSetChanged(); 

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, 
               int position, long id) { 
          String clicked_at = null; 
          try { 
           clicked_at = response.getString(position); 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
          Intent i = new Intent(getApplicationContext(), full_view_walker.class); 
          i.putExtra("data", clicked_at); 
          i.putExtra("lat", finalLat1); 
          i.putExtra("lon", finalLon1); 
          i.putExtra("sender_id", sender_id); 
          startActivity(i); 

         } 
        }); 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      hidePDialog(); 

     } 
    }); 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(movieReq); 
} 

現在我的標籤的東西:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.user_listview); 
    tabHost = (MaterialTabHost) this.findViewById(R.id.tabHost); 
    pager = (ViewPager) this.findViewById(R.id.pager); 

    // init view pager 
    adapter_page = new ViewPagerAdapter(getSupportFragmentManager()); 
    pager.setAdapter(adapter_page); 
    pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      // when user do a swipe the selected tab change 
      tabHost.setSelectedNavigationItem(position); 

     } 
    }); 

    // insert all tabs from pagerAdapter data 
    for (int i = 0; i < adapter_page.getCount(); i++) { 
     tabHost.addTab(
       tabHost.newTab() 
         .setText(adapter_page.getPageTitle(i)) 
         .setTabListener(this) 
     ); 

    }  
@Override 
public void onTabSelected(MaterialTab tab) { 
    pager.setCurrentItem(tab.getPosition()); } 

private class ViewPagerAdapter extends FragmentStatePagerAdapter { 

    public ViewPagerAdapter(FragmentManager fm) { 
     super(fm); 

    } 

    public Fragment getItem(int num) { 
     return new FragmentText(); 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 
    private String[] lst = {"Distance", "Experience", "History"}; 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return lst[position]; 
    } 

} 

而且我已經在這裏FragmentText:

public class FragmentText extends Fragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.front_list, container, false); 
    } 
} 

現在我真的需要2件東西:

1)如何將FragmentText中的inflater.inflate連接到加載列表並加載它的代碼? 2)如何確保每次用戶切換選項卡時不必重新加載,並且列表被加載/排序一次,然後將從那裏重新加載?

編輯:我在FragmentText試過這樣:

public class FragmentText extends Fragment{ 
// Log tag 
private static final String TAG = AvailableList.class.getSimpleName(); 
String sender_id; 
double distanceInMiles; 
Double lat = null; 
Double lon = null; 
private ProgressDialog pDialog; 
private List<viewer> movieList = new ArrayList<viewer>(); 
private ListView listView; 
private CustomListAdapter adapter; 
private String[] leftSliderData = {"Logout", "Contact Us"}; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    lon = getArguments().getDouble("lon"); 
    lat = getArguments().getDouble("lat"); 

} 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View V = inflater.inflate(R.layout.front_list, container, false); 
    listView = (ListView) V.findViewById(R.id.list); 
    adapter = new CustomListAdapter(getActivity(), movieList); 
    Log.d("Adapter", adapter.toString()+""); 
    listView.setAdapter(adapter); 
    final Double finalLat = lat; 
    final Double finalLon = lon; 
    final Double finalLat1 = lat; 
    final Double finalLon1 = lon; 
    JsonArrayRequest movieReq = new JsonArrayRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(final JSONArray response) { 
        Log.d(TAG, response.toString()); 
        //hidePDialog(); 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          viewer movie = new viewer(); 
          LatLng point1 = new LatLng(obj.getDouble("lat"), obj.getDouble("long")); 
          LatLng point2 = new LatLng(finalLat, finalLon); 
          distanceInMiles = LatLngTool.distance(point1, point2, LengthUnit.MILE); 
          movie.setTitle(obj.getString("first_name")); 
          movie.setThumbnailUrl(obj.getString("pic")); 
          movie.setYear(Double.parseDouble(String.format("%.2f", distanceInMiles))); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 

        // notifying list adapter about data changes 
        // so that it renders the list view with updated data 
        adapter.notifyDataSetChanged(); 

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, 
               int position, long id) { 
          String clicked_at = null; 
          try { 
           clicked_at = response.getString(position); 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
          Intent i = new Intent(getActivity(), full_view_walker.class); 
          i.putExtra("data", clicked_at); 
          i.putExtra("lat", finalLat1); 
          i.putExtra("lon", finalLon1); 
          i.putExtra("sender_id", sender_id); 
          startActivity(i); 

         } 
        }); 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      //hidePDialog(); 

     } 
    }); 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(movieReq); 
    return V; 
} 

這是加載頁面時,我打一個標籤,但他們沒有露出來了!不過,我可以看到正在加載的列表的活動!

回答

1

1)如何在FragmentText的inflater.inflate連接到加載列表並填充它的代碼 ?

除了你發佈的內容外,沒有什麼特別的東西可以發揮作用。

這是加載頁面,當我點擊一個標籤,但他們沒有顯示!

是第一個顯示數據的選項卡嗎?

您使用ViewPager與3頁包含相同的片段,所以你有所有頁面相同的佈局。在很多情況下,如果ViewPager與頁面內容具有相同的片段,那麼您描述的行爲就會發生,因爲用戶直接在findViewById()的活動佈局中查找各種頁面的小部件。 findViewById()將在佈局中返回該視圖的第一次出現,所以您將始終從第一頁獲取視圖,除第0頁之外的任何其他頁面將不顯示任何內容,但數據會加載(並從第一個頁面,沒有顯示)。然而,在最後一段代碼片段中,你會在膨脹的佈局中尋找ListView,所以這不是問題(在第一個代碼片段中,你用簡單的findViewById()來查找ListView,但不清楚?),所以你可能想看看你的佈局,並檢查他們的問題。

另一個問題是,如果所有的FragmentText加載相同的數據(「url」相同?)。如果是的話,那麼你不應該在每個片段中進行網絡調用(浪費),相反,你應該有一個網絡調用單點和片段使用單點(一個很好的選擇將是一個沒有UI片段與setRetainInstance ()設置爲true)。

如何確保它不會在每次用戶切換 標籤時重新加載,並且該列表加載/整理一次,然後將只 從那裏重裝?

如上同樣的問題。這3個FragmentText中的每一個都有相同的數據列表嗎?如果是,那麼這些標籤只是根據一些標準(距離,經驗等)對數據進行排序,而不是使用單個數據列表,並將標識符傳遞給FragmentText,以瞭解應該在哪裏進行排序。然後,當片段變得可見時(檢查setUserVisibleHint())根據該頁面的標準對單個數據列表進行排序並將其顯示給用戶。

+0

嘿,謝謝你的回答。第一部分顯然是最重要的(當它顯示時,我將不會重新加載數據等)。目前正在顯示front_list佈局,但它是空白的。所以這個列表沒有被填充到片段視圖中。你有什麼建議如何解決這個問題?我可以告訴你的任何其他代碼? – user1610719

+0

@ user1610719我查看了您的網絡代碼,但沒有看到將新數據添加到適配器列表的位置。在你從json創建查看器對象的for循環中你不應該添加'movieList.add(movie)'這行來將新創建的電影添加到適配器的列表中嗎? – Luksprog

+0

AHH!那個非常愚蠢的男人,我一直堅持這幾天。非常感謝......我會研究你談到的其他事情,並嘗試自己解決這些問題。謝謝! – user1610719