Android ListView不再显示在选项卡内部

Android ListView不再显示在选项卡内部,android,android-listview,android-tabhost,android-support-library,Android,Android Listview,Android Tabhost,Android Support Library,我已经好几个月没碰过这个代码库了。现在我又拿起它了,一些我认为没有更改的代码已经停止工作:应用程序中由SimpleCrsorAdapter填充的所有listfragment ListView都停止工作,只是空白。起初,我认为光标或数据库有故障,或者适配器设置不正确,因此我在onLoadFinished中添加了一些调试: @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { Lo

我已经好几个月没碰过这个代码库了。现在我又拿起它了,一些我认为没有更改的代码已经停止工作:应用程序中由SimpleCrsorAdapter填充的所有listfragment ListView都停止工作,只是空白。起初,我认为光标或数据库有故障,或者适配器设置不正确,因此我在onLoadFinished中添加了一些调试:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    Log.d("IndexListFragment", "Rows returned: " + cursor.getCount());
    Log.d("IndexListFragment", cursor.getColumnName(0));
    Log.d("IndexListFragment", mAdapter.toString());
    Log.d("IndexListFragment", this.getListView().getAdapter().toString());

    mAdapter.swapCursor(cursor);
}
因此,据我所知,光标在那里并且充满了数据,但是交换它并不能填充listview。有什么想法吗

为完整起见,以下是创建和设置适配器的onCreate:

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

    String[] from = new String[] { GuidebookProvider.COL_NAME,
            GuidebookProvider.COL_GRADE };
    int[] to = new int[] { android.R.id.text1, android.R.id.text2 };

    mAdapter = new SimpleCursorAdapter(getActivity(),
            android.R.layout.simple_list_item_2, null, from, to, 0);
    setListAdapter(mAdapter);

    getLoaderManager().initLoader(0, null, this);
}
以及onCreateLoader:

@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle loaderArgs) {
    String orderBy = GuidebookProvider.COL_NAME;
    String[] projection = new String[] { GuidebookProvider.COL_ID, GuidebookProvider.COL_NAME, GuidebookProvider.COL_GRADE };


    return new CursorLoader(getActivity(),
            GuidebookProvider.CONTENT_URI_CLIMB, projection, null, null,
            orderBy);
}
但是,将其作为选项卡的一部分进行调用最终会得到一个空白选项卡:

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;

public class TestActivity extends FragmentActivity {
    private FragmentTabHost mTabHost;

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

        setContentView(R.layout.fragment_tab_host);
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

        Bundle args = new Bundle();
        args.putInt(IndexListFragment.ARGUMENT_INDEX_TYPE,
                IndexListFragment.IndexType.ALPHA.value);
        Drawable drawable = null;
        mTabHost.addTab(mTabHost.newTabSpec("A-Z")
                .setIndicator("A-Z", drawable), IndexListFragment.class, args);

    }
}
以下是我对tabhost的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

    <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />
    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />
    </android.support.v4.app.FragmentTabHost>
 </LinearLayout>

当直接调用片段而不是从选项卡中调用时,片段会正确填充,这一事实似乎表明问题根本不在于游标或适配器,而在于listfragment在选项卡中的操作方式


有谁能指出我在破解这段代码时犯了什么错误(或者在SDK的最后几次更新中发生了什么变化)?它过去工作得很好。

此代码可能会帮助您尝试一下

ViewAllLesson.java:
import java.util.ArrayList;
导入java.util.List;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.widget.CheckBox;
导入android.widget.ListView;
导入com.xyz.R;
导入com.xyz.db.LessonDatabaseConnector;
导入com.xyz.pojo.AssignmentPojo;
导入com.xyz.pojo.LessonPojo;
公共类ViewAllLessons扩展片段{
公共课数据库;
私有视图rootView;
列出经验教训;
ArrayList con=新的ArrayList();
拉平机;
Lesson CustomAdapter Lesson CustomAdapter;
私有列表视图列表视图;
公共静态复选框selectAll;
专用按钮删除BTN;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.add_);
}
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
根视图=充气机。充气(R.layout.lesson\u视图\u所有列表,容器,
假);
//dao=新的AssignmentDatabaseConnector(getActivity());
listView=(listView)rootView.findViewById(R.id.Lesson\u ListAll);
selectAll=(复选框)rootView.findViewById(R.id.selectAll);
deleteBtn=(按钮)rootView.findviewbyd(R.id.LessonDeleteBtn);
Button addNew=(Button)rootView.findViewById(R.id.LessonAddNewBtn);
addNew.setOnClickListener(新OnClickListener(){
@凌驾
公共void onClick(视图v){
//Toast.makeText(getActivity(),“hi”,
//Toast.LENGTH_LONG).show();
第一课=新一课();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.item_detail_container,lesson).commit();
}
});
//viewgr.setScrollContainer(假);
dao=新的LessonDatabaseConnector(getActivity());
lessons=dao.getAllLessonList();
lessonCustomAdapter=新建lessonCustomAdapter(getActivity(),课程,
这),;
setAdapter(lessonCustomAdapter);
/*检查列表视图为空*/

if(lessons.size()今天有机会看了一下,并最终解决了问题。问题出在我的xml布局设置中。奇怪的是,根据我的git存储库,这个文件已经9个月没有更改,所以我想我做的事情只是偶然发生的。我找到了一个教程FragmentTabHosts,它具有不同的布局,并将我的布局更新为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

    <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />
    </android.support.v4.app.FragmentTabHost>

    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />

</LinearLayout>

我已更新以使用文档中的版本,并且它也可以工作:

<android.support.v4.app.FragmentTabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

    </LinearLayout>
</android.support.v4.app.FragmentTabHost>


鉴于我在Android的文档中找到了它,我将坚持使用这个版本。

为什么在
SimpleCursorAdapter
的构造函数中第三个参数为null?。加载程序在不同的线程中填充光标,这样你就不会挂断主应用程序线程,等待数据库填充光标。我不确定这与我的我已经更新了我的问题以进一步解释我的问题。
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;

import com.xyz.R;
import com.xyz.db.LessonDatabaseConnector;
import com.xyz.pojo.AssignmentPojo;
import com.xyz.pojo.LessonPojo;

public class ViewAllLessons extends Fragment {
    public LessonDatabaseConnector dao;
    private View rootView;
    List<LessonPojo> lessons;
    ArrayList<String> con = new ArrayList<String>();
    LayoutInflater mInflater;

    LessonCustomAdapter lessonCustomAdapter;
    private ListView listView;
    public static CheckBox selectAll;
    private Button deleteBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.add_exams);

    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.lesson_view_all_list, container,
                false);

        // dao = new AssignmentDatabaseConnector(getActivity());

        listView = (ListView) rootView.findViewById(R.id.Lesson_ListAll);
        selectAll = (CheckBox) rootView.findViewById(R.id.SelectAll);
        deleteBtn = (Button) rootView.findViewById(R.id.LessonDeleteBtn);
        Button addNew = (Button) rootView.findViewById(R.id.LessonAddNewBtn);
        addNew.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Toast.makeText(getActivity(), "hi",
                // Toast.LENGTH_LONG).show();

                Lesson lesson = new Lesson();
                getActivity().getSupportFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, lesson).commit();
            }
        });

        // viewgr.setScrollContainer(false);
        dao = new LessonDatabaseConnector(getActivity());
        lessons = dao.getAllLessonList();
        lessonCustomAdapter = new LessonCustomAdapter(getActivity(), lessons,
                this);
        listView.setAdapter(lessonCustomAdapter);

        /* To Check List View is empty */
        if (lessons.size() <= 0) {

            View empty = rootView.findViewById(R.id.empty);

            ListView list = (ListView) rootView
                    .findViewById(R.id.Lesson_ListAll);
            list.setEmptyView(empty);
            listView.setVisibility(0);
            empty.setVisibility(1);

        }

        selectAll.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Toast.makeText(getActivity(), "hi",
                // Toast.LENGTH_LONG).show();

                if (((CheckBox) v).isChecked()) {
                    LessonCustomAdapter.flag = true;
                    lessonCustomAdapter.notifyDataSetChanged();
                } else {
                    LessonCustomAdapter.flag = false;
                    LessonCustomAdapter.checkedvalue.clear();
                    lessonCustomAdapter.notifyDataSetChanged();
                }
            }
        });

        // Set the list adapter and get TODOs list via DAO

        deleteBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                LessonDatabaseConnector dao = new LessonDatabaseConnector(
                        getActivity());

                for (int i = 0; i < LessonCustomAdapter.checkedvalue.size(); i++) {
                    //
                    System.out
                            .println("===========LessonCustomAdapter.checkedvalue.size()==========SIZE======>>>>"
                                    + LessonCustomAdapter.checkedvalue.size());
                    System.out
                            .println("===========DELETED LESSON=================>>>>"
                                    + LessonCustomAdapter.checkedvalue.get(i));
                    dao.DeleteLesson(LessonCustomAdapter.checkedvalue.get(i));
                }
                LessonCustomAdapter.flag = false;

                ViewAllLessons viewAllLessons = new ViewAllLessons();
                getFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, viewAllLessons)
                        .commit();
                // finish();

            }

        });

        return rootView;

    }

    private List<AssignmentPojo> getAllAssignmentsList() {
        // TODO Auto-generated method stub
        return null;
    }

}
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import com.xyz.R;
import com.xyz.pojo.LessonPojo;

public class LessonCustomAdapter extends BaseAdapter {
    protected static boolean flag = false;
    private TextView mLessonTitle, mLessonDate;
    private final Context context;
    List<LessonPojo> Lessons;
    private ViewAllLessons viewAllLessons;
    private ArrayList<Boolean> itemChecked = new ArrayList<Boolean>();
    private CheckBox SingleChk;
    public static ArrayList<Long> checkedvalue = new ArrayList<Long>();

    LessonCustomAdapter(Context context, List<LessonPojo> Lessons2,
            ViewAllLessons viewAllLessons) {
        this.context = context;
        this.Lessons = Lessons2;
        this.viewAllLessons = viewAllLessons;
        for (int i = 0; i < Lessons2.size(); i++) {
            itemChecked.add(i, false); // initializes all items value with false
        }
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return Lessons.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub

        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View rowView = convertView;
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            rowView = inflater.inflate(R.layout.lesson_view_row_list, parent,
                    false);
        }

        mLessonDate = (TextView) rowView.findViewById(R.id.LessonDate);
        mLessonDate.setText(Lessons.get(position).getLdate());

        mLessonTitle = (TextView) rowView.findViewById(R.id.LessonTitle);
        mLessonTitle.setText(Lessons.get(position).getLtitle());

        SingleChk = (CheckBox) rowView.findViewById(R.id.singleChk);

        /*
         * if (flag) { System.out.println("66666666666666666666666666666666" +
         * flag); for (int i = 0; i < Lessons.size(); i++) {
         * SingleChk.setChecked(flag); SingleChk.setEnabled(!flag); }
         * 
         * } else { SingleChk.setChecked(itemChecked.get(position)); }
         */
        checkedvalue.clear();
        if (ViewAllLessons.selectAll.isChecked()) {
            SingleChk.setChecked(true);
            Boolean val = false;
            for (int i = 0; i < Lessons.size(); i++) {

                checkedvalue.add(Long.parseLong(Lessons.get(i).getId()));
                System.out
                        .println("ADD SUCCEFULLYYYYYYYY  ======================  "
                                + Long.parseLong(Lessons.get(position).getId()));

            }

        } else {
            SingleChk.setChecked(false);
            checkedvalue.clear();
        }

        rowView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Bundle bundle = new Bundle();
                ViewSingleLesson viewSingleLesson = new ViewSingleLesson();

                bundle.putString("ID", Lessons.get(position).getId());
                bundle.putString("TITLE", Lessons.get(position).getLtitle());
                bundle.putString("COURSE", Lessons.get(position).getLcourse());
                bundle.putString("LEVEL", Lessons.get(position).getLlevel());
                bundle.putString("CLASS", Lessons.get(position).getLclass());
                bundle.putString("DATE", Lessons.get(position).getLdate());
                bundle.putString("DESC", Lessons.get(position).getLdesc());
                bundle.putString("ATTACH", Lessons.get(position).getLfilepath());

                viewSingleLesson.setArguments(bundle);
                viewAllLessons.getFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, viewSingleLesson)
                        .commit();
            }
        });

        SingleChk.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


                Boolean val = false;
                Toast.makeText(context, "hi " + Lessons.get(position).getId(),
                        Toast.LENGTH_LONG).show();
                if (((CheckBox) v).isChecked()) {

                    for (int i = 0; i < checkedvalue.size(); i++) {
                        if (checkedvalue.get(i) == Long.parseLong(Lessons.get(
                                position).getId())) {
                            val = true;
                            System.out
                                    .println("DUPLICATE  ======================  "
                                            + Long.parseLong(Lessons.get(
                                                    position).getId()));
                        } else {
                            val = false;
                        }
                    }
                    if (val == false) {
                        checkedvalue.add(Long.parseLong(Lessons.get(position)
                                .getId()));
                        System.out
                                .println("ADD SUCCEFULLYYYYYYYY  ======================  "
                                        + Long.parseLong(Lessons.get(position)
                                                .getId()));
                    }
                } else {
                    ViewAllLessons.selectAll.setChecked(false);
                    checkedvalue.remove(Long.parseLong(Lessons.get(position)
                            .getId()));
                    System.out
                            .println("Removed SUCCEFULLYYYYYYYY  ======================  "
                                    + Integer.parseInt(Lessons.get(position)
                                            .getId()));
                    // itemChecked.set(position, false);
                }

            }
        });

        return rowView;
    }

}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

    <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />
    </android.support.v4.app.FragmentTabHost>

    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />

</LinearLayout>
<android.support.v4.app.FragmentTabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

    </LinearLayout>
</android.support.v4.app.FragmentTabHost>