Java FragmentPagerAdapter内片段内的列表视图
我对如何在通过FragmentPagerAdapter控制的片段中实现ListView感到非常困惑 目前,我正试图返回一些JSON数据,并根据JSON中的值将数据分为3个单独的列表;'贷款、预订和预订。这就像TeamTreehouse的练习“构建博客阅读器Android应用程序”,我试图在此基础上进行扩展,以进一步学习Android 当我尝试实现片段时,我开始出现问题。据我所知,片段是具有自己活动生命周期的可重用元素,因此实现一个包含所有逻辑的片段,然后使用FragmentPagerAdapter简单地将我需要的信息拉到单独的列表中似乎是完美的。唯一的问题是没有显示ListView,尽管信息是在LogCat中提取的。我花了好几天的时间阅读和研究这个问题,我认为这可能与我如何在片段中实现我的ListView有关,但我确实需要一些帮助 我已经包含了我称为“LoanFragment”的片段类的代码,以及FragmentPagerAdapter“LibraryPagerAdapter”和我称为FragmentPagerAdapter的“Library”类的代码:Java FragmentPagerAdapter内片段内的列表视图,java,android,listview,android-listview,android-fragments,Java,Android,Listview,Android Listview,Android Fragments,我对如何在通过FragmentPagerAdapter控制的片段中实现ListView感到非常困惑 目前,我正试图返回一些JSON数据,并根据JSON中的值将数据分为3个单独的列表;'贷款、预订和预订。这就像TeamTreehouse的练习“构建博客阅读器Android应用程序”,我试图在此基础上进行扩展,以进一步学习Android 当我尝试实现片段时,我开始出现问题。据我所知,片段是具有自己活动生命周期的可重用元素,因此实现一个包含所有逻辑的片段,然后使用FragmentPagerAdapte
public class LoanFragment extends Fragment {
ListView lv;
private final String KEY_TITLE = "Title";
private final String KEY_AUTHOR = "Author";
public static final String TAG = Library.class.getSimpleName();
protected JSONArray mTasksData;
SessionManager session;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.booked_fragment, container, false);
lv = (ListView) rootView.findViewById(R.id.listMe);
bindListView();
return rootView;
}
public void bindListView() {
new GetLibraryInformation(getActivity(),lv).execute("");
}
class GetLibraryInformation extends AsyncTask<Object, Void, JSONArray> {
ListView mListView;
Activity mContext;
public GetLibraryInformation(Activity context,ListView gview) {
this.mListView=gview;
this.mContext=context;
}
@Override
protected JSONArray doInBackground(Object... params) {
JSONArray jsonResponse = null;
// Get JSON data, all coming through fine
}
@Override
protected void onPostExecute(JSONArray result) {
mTasksData = result;
String[] keys = { KEY_TITLE, KEY_AUTHOR };
int[] ids = { android.R.id.text1, android.R.id.text2 };
String author = "";
String title = "";
List<HashMap<String, String>> fetch2 = new ArrayList<HashMap<String, String>>();
if(mTasksData == null) {
}
else {
try {
for (int i = 0; i < mTasksData.length(); i++) {
JSONObject task = mTasksData.getJSONObject(i);
if(task.has(KEY_TITLE)) {
title = task.getString(KEY_TITLE);
}
else {
title = "Title not set.";
}
if(task.has(KEY_AUTHOR)) {
author = task.getString(KEY_AUTHOR);
}
else {
author = "Author not set.";
}
HashMap<String, String> libraryInfo = new HashMap<String, String>();
libraryInfo = new HashMap<String, String>();
libraryInfo.put(KEY_TITLE, title);
libraryInfo.put(KEY_AUTHOR, author);
fetch2.add(libraryInfo);
}
SimpleAdapter adapter = new SimpleAdapter(getActivity(), fetch2, android.R.layout.simple_list_item_2, keys, ids);
lv.setAdapter(adapter);
}
catch(JSONException e) {
Log.e(TAG, "Exception caught! ", e);
}
}
}
}
}
和我的图书馆,扩展碎片活动:
public class Library extends FragmentActivity implements ActionBar.TabListener {
private ViewPager viewPager;
private LibraryPagerAdapter mAdapter;
private ActionBar actionBar;
private String[] tabs = { "Loan", "Reservation", "Booked" };
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_library);
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new LibraryPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
}
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.tasks, menu);
return true;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
最后是“booked_fragment.xml”,我正试图使用它来显示ListView:
FragmentPagerAdapter都使用相同的片段导入android.support.v4.app.Fragment,但是应用程序,除了存在的选项卡之外,只是返回完全空白
任何帮助都将不胜感激,因为我已经开始变成萝卜了
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="vertical"
android:background="#ffffff"
android:layout_height="fill_parent" >
<ListView android:id="@+id/listMe"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:background="#f9f9f9"
android:layout_weight="1"
android:drawSelectorOnTop="false"
/>
</LinearLayout>
这是对要传递给SimpleAdapter的布局的误解。 在对构造函数上下文的调用中,List>data,int-resource,String[]from,int[]to需要传递列表项的布局,而不是包含ListView本身的布局。
当项目显示在ListView中并动态添加时,SimpleAdapter希望知道并传递此布局。如果您将其与表进行比较,例如:您使用的布局定义了表的布局,列表项的布局定义了该表中一行的外观。谢谢您,Peter,我刚刚注意到我现在把它放错了,并对其进行了编辑,因此它现在使用的不是预定的片段而是androids simple\u list\u item\u 2,但是列表仍然没有显示:/您可以发布简单的\u列表\u项目\u 2.xml吗?请确保取2.5码!=确实,android.R.layout.simple_list_item_2.xml的源代码位于这里:fetch2在logcat中肯定不是空的。非常感谢。fetch2在logcat中是这样的:fetch2[{Author=线索状态,Title=简介},{Author=鲍里斯·兰登,Title=阿甘正传2:觉醒},{Author=作者未设定,Title=圣女贞德}]抱歉浪费你的时间,彼得,出于某种原因,文本在白色背景下默认为白色:我现在觉得很愚蠢
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="vertical"
android:background="#ffffff"
android:layout_height="fill_parent" >
<ListView android:id="@+id/listMe"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:background="#f9f9f9"
android:layout_weight="1"
android:drawSelectorOnTop="false"
/>
</LinearLayout>