【问题标题】:ListView with three options on same activityListView 与同一活动的三个选项
【发布时间】:2014-12-19 05:01:05
【问题描述】:

我有一个列表视图,现在我正在尝试为此列表视图设置选项卡视图。

现在有时有 3 个选项,有时是 2,有时是 1。正如您在此处看到的那样

当单击选项卡时,我将根据单击选项卡栏中的哪个项目来使用新数据重新加载列表视图。但这是相似的数据,所以它将在同一个列表视图中,我想使用相同的 xml 布局。但目前我无法做到这一点,我无法让它发挥作用。

这就是我所拥有的

 myTabHost =(TabHost) findViewById(R.id.TabHost01);
    myTabHost.setup();

    TabHost.TabSpec spec1 = myTabHost.newTabSpec("First Tab");
    spec1.setIndicator("First Tab", getResources().getDrawable(android.R.drawable.ic_menu_add));
    spec1.setContent(R.id.tab1);
    myTabHost.addTab(spec1);

    myTabHost.addTab(myTabHost.newTabSpec("Second Tab").
            setIndicator("Second Tab", getResources().getDrawable(android.R.drawable.ic_menu_edit)).setContent(R.id.tab2));

这是为 2 个选项卡设置它,然后在我的 xml 中

<include
                android:id="@+id/tab1"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                layout="@layout/item_list_view">


            </include>

            <include
                android:id="@+id/tab2"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                layout="@layout/test">


            </include>

但是我想使用相同的布局而不是不同的布局,并且只是重新加载数据,但是当我将选项卡 .setContent 设置为相同的 id 时它不起作用?

所以基本问题是我如何为多个选项卡使用相同的 xml,并在列表视图中加载不同的数据?

如果重要,标签栏将填充文本而不是图像。看过一些关于这方面的教程,但对我的情况没有帮助 https://www.youtube.com/watch?v=OeNC_sShJXs https://www.youtube.com/watch?v=1-u3toC6ctY

所以我需要一些帮助来设置它。

提前感谢您的帮助:)

【问题讨论】:

  • 尽量简单地提出问题。您可以将预期的输出与图像一起使用,并且有很多选项。
  • @DonChakkappan 查看编辑

标签: android listview android-tabhost segmentedcontrol


【解决方案1】:

据我了解,这个问题涉及两部分:

  1. 以编程方式创建选项卡。
  2. 在选项卡之间共享相同的内容视图。

对于第一部分,您可以在布局中放置一个“空”TabHost,然后再调用addTab(),具体取决于您要显示的选项卡。例如,布局文件将是:

<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TabHost01"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </TabWidget>

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

然后,在onCreate()

TabHost tabHost = (TabHost)findViewById(R.id.TabHost01);
tabHost.setup();
tabHost.addTab(tabHost.newTabSpec(...));
tabHost.addTab(tabHost.newTabSpec(...));

其中每个TabHost.TabSpec 指定每个选项卡的指示符和内容。

现在,至于第二部分,您需要一个单个 ListView 小部件并在用户切换选项卡时更改其数据。这实际上很容易,因为TabHost 可以处理多个选项卡具有相同内容的情况而不会出现问题。您只需为每个选项卡设置一个TabHost.TabContentFactory,并让每个选项卡返回相同 视图。

例如:

mListView = new ListView(this);

TabHost tabHost = (TabHost)findViewById(R.id.TabHost01);
tabHost.setup();
tabHost.addTab(tabHost.newTabSpec("1").setIndicator("First").setContent(mDummyTabContent));
tabHost.addTab(tabHost.newTabSpec("2").setIndicator("Second").setContent(mDummyTabContent));
tabHost.addTab(tabHost.newTabSpec("3").setIndicator("Third").setContent(mDummyTabContent));

mTabContent 被初始化为:

private final TabHost.TabContentFactory mDummyTabContent = new TabHost.TabContentFactory()
{
    @Override
    public View createTabContent(String tag)
    {
        return mListView;
    }
};

那么剩下的最后一步就是添加一个TabHost.OnTabChangeListener,用于切换单个ListView中的数据:

tabHost.setOnTabChangedListener(mOnTabChangedListener);
mOnTabChangedListener.onTabChanged("1");

地点:

private TabHost.OnTabChangeListener mOnTabChangedListener = new TabHost.OnTabChangeListener()
{
    @Override
    public void onTabChanged(String tabId)
    {
        String[] data;

        if (tabId.equalsIgnoreCase("1"))
            data = FIRST_ITEMS;
        else if (tabId.equalsIgnoreCase("2"))
            data = SECOND_ITEMS;
        else
            data = THIRD_ITEMS;

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(FakeTabViewActivity.this, android.R.layout.simple_list_item_1, data);
        mListView.setAdapter(adapter);
    }
};

带有活动和布局文件的示例要点可在here 获得。

【讨论】:

  • 好吧看起来不错,即将实现它的ID找到的列表视图在哪里,或者它位于哪里?来自具有列表视图的 xml 文件?
  • 查看完整列表视图和适配器的要点,gist.github.com/spennyf/3241dd694af464c7e576
  • @iqueqiorio 在我发布的示例中,它是在onCreate() 中以编程方式创建的,但您不妨改用LayoutInflater.inflate()
  • 好的,我知道你在哪里做了,但是我应该如何为我的自定义列表视图和自定义适配器更改它?,我的数据也是从网络加载的,所以我不想显示直到我加载了我的数据
  • @iqueqiorio 我看到了你的 XML。因为它只包含HeaderListView(加上一个不需要的LinearLayout),你不妨以编程方式创建它(它甚至更简单)。对于第二部分,使用onTabChanged() 中的AsyncTask 来加载数据并在适配器到达时对其进行设置。
【解决方案2】:

将 TabHost 视图添加到您的布局中。您可以使用 addTab() 方法动态添加任意数量的选项卡。

public class MainActivity extends Activity {

private TabHost myTabHost;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTabHost =(TabHost) findViewById(R.id.TabHost01);
            mytabhost.setup();

TabSpec spec = mytabhost.newTabSpec("tab_creation");
spec.setIndicator("Create adresse",getResources().getDrawable(android.R.drawable.ic_menu_add));
    spec.setContent(R.id.onglet1);
    mytabhost.addTab(spec);

    mytabhost.addTab(mytabhost.newTabSpec("tab_inser").setIndicator("Delete",getResources().getDrawable(android.R.drawable.ic_menu_edit)).setContent(R.id.Onglet2));

   mytabhost.addTab(mytabhost.newTabSpec("tab_affiche").setIndicator("Show All",getResources().getDrawable(android.R.drawable.ic_menu_view)).setContent(R.id.Onglet3));

   ListView lv=(ListView) findViewById(R.id.listView1);
   MyListAdapter adapter =new MyListAdapter(this);
   lv.setAdapter(adapter);              
 }
}

完整参考:http://mrbool.com/how-to-create-an-activity-android-with-a-tabhost-view/27990

【讨论】:

  • 好的,但是我的 xml 对于每个选项卡都是一样的,我会改变什么?
  • 您可以使用 setOnTabChangedListener(TabHost.OnTabChangeListener l) 方法并使用新值重置适配器。
  • 好的,所以我已经设置好了并且大部分时间都在工作,但是当我将当前选项卡设置为 0 时,没有加载数据?但如果它设置为 1 它会加载
  • 默认初始加载第0个标签的数据并设置。然后在更改其他选项卡的选项卡加载数据时。
  • 当我将 onglet1 和 Onglet2 设置为相同的布局时,它不会加载?如何将相同的 xml 用于多个选项卡
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多