无法使用具有可转换视图的Android标签将信息从一个标签正确传递到另一个标签并正确显示

时间:2016-02-05 15:43:51

标签: android listview android-fragments android-tabs

编辑:感谢@ankit aggarwal,我有一部分工作,即TAB 1没有切换到TAB 2.仍然需要帮助才能在TAB 2中刷新视图。

我正在开发一个应用,我正在使用标签。我的应用程序基于我在互联网上找到的一个例子here

我所拥有的是TAB中的ListView 1.我想要发生的是当我点击列表中的某个项目时,它会向TAB 2发送一个ID,我想根据传递的数据填充另一个ListView 。我在解决这个问题时遇到了问题。

目前,我有它工作,如果我单击TAB 1列表中的项目,然后TAB 2确实获取数据并填充新列表,但它添加到TAB 2上的视图而不是刷新/覆盖/ etc。,应用程序不会自动切换到新选项卡。这就是我在TAB 2中的布局(即接收标签):

person.xml

<LinearLayout android:id="@+id/person_information_layout">
    <TextView android:id="@+id/header_row" />
    <LinearLayout>
        <TextView android:id="@+id/column1_row_header" />
        <TextView android:id="@+id/column2_row_header" />
        <TextView android:id="@+id/column3_row_header" />
    </LinearLayout>
    <ListView android:id="@+row_of_data"></ListView>
</LinearLayout>

我使用AdapterView和数据库Cursor在接收选项卡(TAB 2)中填充此列表。

PersonInformation.java

package myPackage;

public class PersonInformation extends Fragment {

    private View rootView;
    private DatabaseHelper myDBHelper;
    private Cursor informationCursor;
    private SimpleCursorAdapter mySimpleCursorAdapter;

    private TextView personIDDisplay;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

        rootView = inflater.inflate(R.layout.person, container, false);

        personID = getArguments().getString("personID");

        myDBHelper = new DatabaseHelper(getActivity());

        informationCursor = myDBHelper.getInformationCursor(personID);
        String[] fromColumns = {"firstname", "lastname", "homephone", "homeaddress"};
        int[] toViews = {R.id.firstname_textview, R.id.lastname_textview, R.id.homephone_textview, R.id.homeaddress_textview};
        mySimpleCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.person_information, informationCursor, fromColumns, toViews, 0);

        personIDDisplay = (TextView) rootView.findViewById(R.id.header_row);
        personIDDisplay.setText("Person ID: " + personID);

        ListView myListView = (ListView) rootView.findViewById(R.id.row_of_data);
        myListView.setAdapter(mySimpleCursorAdapter);

        myDBHelper.close();

        return rootView;
    }
}

这是填充的person_information布局:

person_information.xml

<LinearLayout>
        <TextView android:id="@+id/column1_data" />
        <TextView android:id="@+id/column2_data" />
        <TextView android:id="@+id/column3_data" />
</LinearLayout>

这是我的发送标签(TAB 1)

Home.java

package myPackage;

public class Home extends Fragment {

    private View rootView;
    private DatabaseHelper myDBHelper;
    private Cursor personCursor;
    private SimpleCursorAdapter mySimpleCursorAdapter;
    private Activity myActivity;

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

        myDBHelper = new DatabaseHelper(getActivity());

        personCursor = myDBHelper.getPersonCursor();
        String[] fromColumns = {"personID"};
        int[] toViews = {R.id.person_id_textview};
        mySimpleCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.person_layout, personCursor, fromColumns, toViews, 0);

        ListView myListView = (ListView) rootView.findViewById(R.id.person_row);

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Cursor subCursor = (Cursor) mySimpleCursorAdapter.getItem(position);
                String personIDNumber = subCursor.getString(subCursor.getColumnIndex("personID"));

                PersonInformation personInformation = new PersonInformation();
                Bundle myBundle = new Bundle();
                myBundle.putString("personID", personIDNumber);
                personInformation.setArguments(myBundle);
                getFragmentManager().beginTransaction().replace(R.id.person_information_layout, personInformation).commit();
            }
        });

        myListView.setAdapter(mySimpleCursorAdapter);

        myDBHelper.close();

        return rootView;
    }
}

正如您所看到的,我有一个布局,其中包含顶部信息行,然后是一行列标题,然后是数据行。我想要的是这个:

Top Information Row
Column Headers
data row 1
data row 2
...
data row n

目前,当我单击TAB 1中的人时,TAB 2确实从TAB 1获取数据并正确填充新列表,但是它在已经存在的顶部信息行和列标题下绘制它,因此我有图层:

Top Information Row
Column Headers
Top Information Row
Column Headers
data row 1
data row 2
...
data row n

此外,当我单击TAB 1中的一行时,该选项卡不会自动从TAB 1切换到TAB 2.

而不是发送标签中的这一行(TAB 1)

getFragmentManager().beginTransaction().add(R.id.person_information_layout, personInformation).commit();

我把它改成了这一行:

getFragmentManager().beginTransaction().add(R.id.row_of_data, personInformation).commit();

但是我得到了错误:

"addView(View) not supported in AdapterView"

根据我的理解,我无法将ListView添加到ListView,因此我将其更改回ListView的父级,但后来我得到了重复的视图。

我一直希望从

更改接收标签(TAB 2)中的行
ListView myListView = (ListView) rootView.findViewById(R.id.row_of_data);

到这个

LinearLayout myLinearLayout = (LinearLayout) rootView.findViewById(R.id.person_information_layout);

但是游标适配器无法使用它。

我需要做些什么来实现这个目标?

2 个答案:

答案 0 :(得分:0)

(1)

  

目前,当我点击TAB 1中的人时,TAB 2确实获得了数据   从TAB 1并正确填充新列表,但它绘制它   在已存在的顶部信息行和列标题下,所以   我有图层:

这种情况正在发生,因为这句话不是切换到tab2,而是在你的活动框架之上添加一个新的片段。

getFragmentManager()。beginTransaction()。add(R.id.person_information_layout,personInformation).commit();

(2)

  

此外,当I时,选项卡不会自动从TAB 1切换到TAB 2   单击TAB 1中的一行。

您在此标签实施中使用了一个viewpager。因此,要更改为tab2,您可以执行

viewPager.setCurrentItem(2);

注意:此处缺少的是视图寻呼机自动将页面上一页和下一页面加载到特定页面。所以当你在tab1时,tab2已经被加载了。因此,当您单击列表项时,您的tab2不会刷新,因为它已经加载了。

答案 1 :(得分:0)

我解决类似问题的方法是通过创建从活动到片段的回调方法以及从片段到活动的回调方法。当我点击fragment1列表中的一行时,我将信息保存在该片段的参数中,并调用该活动的回调函数。在该函数中,我检索传递的信息并将其加载到fragment2的参数并调用fragment2的回调函数。在那里,我检索传递的信息并更新fragment2的列表。然后,我在活动中调用tabLayout.getTabAt(newPosition)来重新显示fragment2的页面。您还必须确保因为片段的视图在页面之间移动而被销毁,要检查片段是否仍然填充列表,以及是否还原列表中的项目。