여기에 완전한 멍청한 놈이 나와 함께 있으니. 내 서버에서 데이터를로드하고 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;
}
내가 탭을 쳤을 때이 페이지를로드하는 것입니다,하지만 그들은 표시되지 않습니다! 로드되고있는 목록의 활동을 볼 수 있습니다!
안녕하세요, 답변 해 주셔서 감사합니다. 첫 번째 부분은 분명히 가장 중요합니다 (데이터를 다시로드하지 않고 표시 할 때). 현재 front_list 레이아웃이 보이지만 비어 있습니다. 따라서 목록은 조각보기에 채워지지 않습니다. 이 문제를 해결하는 방법에 대한 제안 사항이 있습니까? 내가 보여줄 수있는 다른 코드? – user1610719
@ user1610719 네트워크 코드를 살펴본 결과 새 데이터를 어댑터 목록에 추가하는 위치가 표시되지 않습니다. json에서 뷰어 객체를 생성하는 for 루프에서'movieList.add (movie)'줄을 추가해서 새로 만든 동영상을 어댑터의 목록에 추가하지 않아야합니까? – Luksprog
AHH! 너무 바보 였어. 나는이 일을 며칠 동안 붙들고 있었다. 고마워요 ... 당신이 이야기 한 다른 것들을 살펴보고 저 혼자만 알아 내려고 노력하겠습니다. 감사! – user1610719