2015-01-16 4 views
0

여기에 완전한 멍청한 놈이 나와 함께 있으니. 내 서버에서 데이터를로드하고 Listview에 표시하는 활동이 있습니다. 이제 TabHost를 기반으로 목록을 다시 정렬 할 수 있어야합니다.TabHost에서 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); 
} 

이제 내 탭 물건 : : 여기 FragmentText 한

@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]; 
    } 

} 

그리고 :

내가 MaterialTabHost을 사용하고 있습니다 ( https://github.com/neokree/MaterialTabs)

는 여기에 내가 목록보기를 채우는 데 사용하는 코드는

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를 연결하는?

게시 한 것 외에 특별한 것이 없습니다. 작동해야합니다.

탭을 눌렀을 때 페이지가로드되지만 표시되지 않습니다.

첫 번째 탭에 데이터가 표시됩니까?

동일한 단편을 포함하는 3 페이지의 ViewPager을 사용하므로 모든 페이지에서 동일한 레이아웃을 갖습니다. 이 경우 ViewPager가 페이지 내용과 동일한 부분을 가진 경우 대부분 사용자가 findViewById()를 사용하여 활동 레이아웃에서 다양한 페이지의 위젯을 직접 찾게되므로 설명하는 동작이 발생합니다. findViewById()는 레이아웃에서 첫 번째 발생 된 뷰를 반환하므로 항상 첫 페이지에서 뷰를 가져오고 페이지 0 이외의 다른 페이지는 데이터가로드되지만 첫 번째 뷰에서 위젯에 설정되면 표시됩니다 페이지가 표시되지 않음). 그러나 마지막 코드 스 니펫에서는 ListView가 부풀어 오른 레이아웃으로 보이므로 문제가되지 않습니다 (간단한 findViewById()가있는 ListView를 찾는 첫 번째 코드 단편에서 불분명합니까?) 그래서보고 싶을 수 있습니다. 레이아웃을 확인하고 문제가 없는지 확인하십시오.

또 다른 질문은 모든 FragmentText가 동일한 데이터 ("url"은 같은가요?)를로드하는 것입니다. 그렇다면 각 조각 (낭비)에서 해당 네트워크 호출을 수행해서는 안되며, 단일 지점에서 네트워크 호출을 작성하고 그 단일 지점을 사용하여 조각을 작성해야합니다 (좋은 옵션은 setRetainInstance()를 true로 설정).

어떻게 확인은 사용자가 탭을 전환 할 때마다 다시로드 할 필요가 없습니다 수 있도록하고, 목록/한 번 분류로드되어 있고 거기에서 다음 것입니다 단지 다시로드?

위와 동일한 질문입니다. 그 3 개의 FragmentText 각각에있는 동일한 데이터 목록이 있습니까? 그렇다면 그 탭은 데이터의 단일 목록을 가지고 FragmentText에 식별자를 전달하여 거기에서 수행되어야하는 정렬을 알기보다는 일부 기준 (거리, 경험 등)에 따라 데이터를 정렬합니다. 그런 다음 조각이 표시되면 (setUserVisibleHint() 확인) 해당 페이지에 대한 기준에 따라 단일 데이터 목록을 정렬하고 사용자에게 표시합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 첫 번째 부분은 분명히 가장 중요합니다 (데이터를 다시로드하지 않고 표시 할 때). 현재 front_list 레이아웃이 보이지만 비어 있습니다. 따라서 목록은 조각보기에 채워지지 않습니다. 이 문제를 해결하는 방법에 대한 제안 사항이 있습니까? 내가 보여줄 수있는 다른 코드? – user1610719

+0

@ user1610719 네트워크 코드를 살펴본 결과 새 데이터를 어댑터 목록에 추가하는 위치가 표시되지 않습니다. json에서 뷰어 객체를 생성하는 for 루프에서'movieList.add (movie)'줄을 추가해서 새로 만든 동영상을 어댑터의 목록에 추가하지 않아야합니까? – Luksprog

+0

AHH! 너무 바보 였어. 나는이 일을 며칠 동안 붙들고 있었다. 고마워요 ... 당신이 이야기 한 다른 것들을 살펴보고 저 혼자만 알아 내려고 노력하겠습니다. 감사! – user1610719