【问题标题】:It's possible to add ImageView programatically on ListFragment?可以在 ListFragment 上以编程方式添加 ImageView 吗?
【发布时间】:2015-04-17 11:54:28
【问题描述】:

在我的项目中,我有一个Fragment,即ListFragment。到目前为止我所做的是用来自SQLite 数据库的数据填充列表;但现在,我面临这个问题:

如果数据库中没有数据,我的ListFragment 将为空;这就是为什么我想用图片代替列表。

现在,我被困在如何在我的ListFragment 中使用onCreateView

我发现的一种替代方法是:“使用Fragment 而不是ListFragment

有没有其他方法可以做到这一点,而不用 Fragment 替换 ListFragment

编辑 1

这在doInBackGround内部:

Conexion = new MarketSQLite(getActivity(), "market", null, 1);
mItems = new ArrayList<ListViewItem>();
db = Conexion.getReadableDatabase();

Cursor c;
c = db.rawQuery("Select NOM_OFER,PREU_OFERTA,DATA_F,FOTO,PERCENTDESCOMPTE from T_OFERTA", null);
c.moveToFirst();
// HERE'S NOT NULL, SO I CAN PUT SOME STUFF
if (c != null) {
    do {
        for (int i = 0; i < c.getColumnCount(); i++) {
            Title = c.getString((c.getColumnIndex("NOM_OFER")));
            Preu = c.getColumnIndex("PREU_OFERTA");
            percent = c.getString((c.getColumnIndex("PERCENTDESCOMPTE")));
            data_f = c.getString((c.getColumnIndex("DATA_F")));
            URLTest = c.getString((c.getColumnIndex("FOTO")));
            Log.e("", "" + c.getString(i));

            // initialize and set the list adapter
            // Toast.makeText(getActivity(), "Title" + Title + "Preu" + Preu + "Percent" + percent + "Cheese is " + data_f, Toast.LENGTH_LONG).show();
        }

        mItems.add(new ListViewItem(URLTest, Title, Preu.toString(), percent, data_f));
    } while (c.moveToNext());
}

if (c== null) {
    getListView().setEmptyView(getActivity().findViewById(R.id.layout_empty));
    // HERE I WANT TO ADD IMAGEVIEW CAUSE C IS NULL THEN THE FRAGMENT WON'T BE EMPTY
}
c.close();

这就是我面临的错误:

java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:841)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
    at info.androidhive.slidingmenu.MisOfertasFragment$MyAsyncTask.doInBackground(MisOfertasFragment.java:108)
    at info.androidhive.slidingmenu.MisOfertasFragment$MyAsyncTask.doInBackground(MisOfertasFragment.java:86)
    at android.os.AsyncTask$2.call(AsyncTask.java:288)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:841)

编辑 2

我对光标进行了一些更改。我删除了我的SQLite 上的一些数据以测试它是否有效;但现在,它什么也没显示。

Cursor c;
c = db.rawQuery("Select NOM_OFER,PREU_OFERTA,DATA_F,FOTO,PERCENTDESCOMPTE from T_OFERTA", null);

//HERE'S NOT NULL, SO I CAN PUT SOME STUFF
if (c.moveToFirst()) {
    do {
        for (int i = 0; i < c.getColumnCount(); i++) {
            Title = c.getString((c.getColumnIndex("NOM_OFER")));
            Preu = c.getColumnIndex("PREU_OFERTA");
            percent = c.getString((c.getColumnIndex("PERCENTDESCOMPTE")));
            data_f = c.getString((c.getColumnIndex("DATA_F")));
            URLTest = c.getString((c.getColumnIndex("FOTO")));
            Log.e("", "" + c.getString(i));

            // initialize and set the list adapter
            // Toast.makeText(getActivity(), "Title" + Title + "Preu" + Preu + "Percent" + percent + "Cheese is " + data_f, Toast.LENGTH_LONG).show();
        }

        mItems.add(new ListViewItem(URLTest, Title, Preu.toString(), percent, data_f));
    } while (c.isAfterLast());
}

if (!c.moveToFirst()) {
    Log.d("No registres","pewpew");

    // HERE I WANT TO ADD IMAGEVIEW CAUSE C IS NULL THEN THE FRAGMENT WON'T BE EMPTY
}
c.close();

【问题讨论】:

  • 如果列表为空,您希望显示一张图片来代替列表吗?
  • 不,如果我的列表为空,我想在中心显示一个图像
  • 为此,您需要将 emptyview 添加到 ListFragment Listview
  • 这太简单了。只需为您的列表视图添加一个 EmptyView
  • 我必须在 xml 上添加 EmptyView 的位置?

标签: android android-fragments fragment android-listfragment


【解决方案1】:

尝试替换

Cursor c;
c = db.rawQuery("Select NOM_OFER,PREU_OFERTA,DATA_F,FOTO,PERCENTDESCOMPTE from T_OFERTA", null);

//HERE'S NOT NULL, SO I CAN PUT SOME STUFF
if (c.moveToFirst()) {
    do {
        for (int i = 0; i < c.getColumnCount(); i++) {
            Title = c.getString((c.getColumnIndex("NOM_OFER")));
            Preu = c.getColumnIndex("PREU_OFERTA");
            percent = c.getString((c.getColumnIndex("PERCENTDESCOMPTE")));
            data_f = c.getString((c.getColumnIndex("DATA_F")));
            URLTest = c.getString((c.getColumnIndex("FOTO")));
            Log.e("", "" + c.getString(i));

            // initialize and set the list adapter
            // Toast.makeText(getActivity(), "Title" + Title + "Preu" + Preu + "Percent" + percent + "Cheese is " + data_f, Toast.LENGTH_LONG).show();
        }

        mItems.add(new ListViewItem(URLTest, Title, Preu.toString(), percent, data_f));
    } while (c.isAfterLast());
}

if (!c.moveToFirst()) {
    Log.d("No registres","pewpew");

    // HERE I WANT TO ADD IMAGEVIEW CAUSE C IS NULL THEN THE FRAGMENT WON'T BE EMPTY
}
c.close();

Cursor c;
c = db.rawQuery("Select NOM_OFER,PREU_OFERTA,DATA_F,FOTO,PERCENTDESCOMPTE from T_OFERTA", null);

//HERE'S NOT NULL, SO I CAN PUT SOME STUFF
if (c.moveToFirst()) {
    do {

            Title = c.getString((c.getColumnIndex("NOM_OFER")));
            Preu = c.getColumnIndex("PREU_OFERTA");
            percent = c.getString((c.getColumnIndex("PERCENTDESCOMPTE")));
            data_f = c.getString((c.getColumnIndex("DATA_F")));
            URLTest = c.getString((c.getColumnIndex("FOTO")));


        mItems.add(new ListViewItem(URLTest, Title, Preu.toString(), percent, data_f));
    } while (c.moveToNext());
}

if (!c.moveToFirst()) {
    Log.d("No registres","pewpew");

    // HERE I WANT TO ADD IMAGEVIEW CAUSE C IS NULL THEN THE FRAGMENT WON'T BE EMPTY
}
c.close();

然后放这个 -

getListView().setEmptyView(findViewById(R.id.layout_empty));

在调用 setListAdapter 之前。

让我们看看,是否可行。

【讨论】:

  • 但它不会显示图像 :(... 我为放置 ListItem 而制作的 bucle 可以正常工作,正如我所说的,当我的 SQLite 上没有数据时它不起作用它什么也不显示,只是一个空白片段
  • 没有放 -"getListView().setEmptyView(getActivity().findViewById(R.id.layout_empty));"在 setListAdapter 工作之前?
【解决方案2】:

如果我理解正确 - 你可以让你的布局看起来像这样。如果 listview 为空,则具有此类 id 的 ImageView 将显示在页面的中心

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

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:dividerHeight="1px"
        android:paddingLeft="3dp"
        android:paddingRight="3dp">
    </ListView>

    <ImageView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
<!-- Maybe some your stuff here --> 
</LinearLayout>

【讨论】:

    【解决方案3】:

    您好,如果您扩展列表片段并希望在列表视图为空时设置图像视图。 android提供设置空视图方法,用于在列表视图没有可用数据时显示视图。见下文如何设置空视图。

    下面是我的列表片段的布局布局内容当列表视图没有内容显示时将显示的图像视图的空布局。实际上它总是隐藏在列表视图后面。

    <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:orientation="vertical"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:paddingLeft="8dp"
             android:paddingRight="8dp">
    
         <ListView 
               android:id="@id/android:list"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:background="#00FF00"/>
    
          <include layout="@android:layout/empty_content" />
     </LinearLayout>
    

    empty_content.xml

    <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/layout_empty"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center" >
    
      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_app_logo" />
    
    </LinearLayout>
    

    在你的java代码中打开你的列表片段,在你的片段中添加下面的行。

    getListView().setEmptyView(findViewById(R.id.layout_empty));
    

    【讨论】:

    • 我做到了,但是当我启动它时,它只显示 ItemList 内的图像,我想将它显示在 ListItem 内部的中心
    • 如果即使您的列表视图有数据也显示空视图,那么只需在布局中设置可见性即可。当列表视图没有要显示的数据时,列表视图会自行使其可见。
    • 我正在测试它等等:D
    • 如果您扩展 ListFramgnet 或 Normal Fragment,我的解决方案将适用于这两种情况。如果你扩展了普通的 Fragment 那么你必须使用列表视图的对象来定义空,例如 mListiew.setEmptyView(findViewById(R.id.layout_empty));其他明智的 getListView() 在您扩展 ListFragment 时可用。
    • 我认为我做错的事情是在我检查光标时,让我用一些代码编辑我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多