![](/img/trans.png)
[英]Android actionbar tabs + swipe view pager navigate from one tab to another dynamically
[英]Cannot get Android tabs with swipable view to correctly pass information from one tab to another and display it correctly
編輯:感謝@ankit aggarwal,我得到了工作的一部分,這是TAB 1不切換到TAB2。仍然需要幫助,以便在TAB 2中不刷新視圖。
我正在開發一個使用標簽的應用程序。 我根據我的應用程序的一個例子,我在互聯網上找到這里 。
我所擁有的是TAB 1中的ListView。我想要發生的是,當我單擊列表中的一個項目時,它將向ID TAB 2發送一個ID,在其中我要根據傳遞的數據填充另一個ListView。 我在使它正常工作方面遇到問題。
當前,它可以正常工作,因此,如果我單擊TAB 1上列表中的一個項目,則TAB 2會獲取數據並填充新列表,但是它會添加到TAB 2上的視圖中,而不是刷新/覆蓋/等。 ,並且該應用不會自動切換到新標簽。 這就是我在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>
這是我的發送標簽(標簽1)
家.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"
據我了解,我無法將View添加到ListView,所以我將其更改回ListView的父級,但是隨后得到了重復的視圖。
我繼續回到想更改我的“接收”標簽(TAB 2)中的行
ListView myListView = (ListView) rootView.findViewById(R.id.row_of_data);
對此
LinearLayout myLinearLayout = (LinearLayout) rootView.findViewById(R.id.person_information_layout);
但是游標適配器將無法與此配合使用。
我需要做什么才能使它正常工作?
(1)
當前,當我單擊TAB 1中的人時,TAB 2確實從TAB 1中獲取了數據並正確地填充了一個新列表,但是它將其繪制在已經存在的頂部信息行和列標題下,因此我具有以下幾層:
之所以發生這種情況,是因為該語句沒有切換到tab2,而是在活動框架的頂部添加了一個新片段。
getFragmentManager()。beginTransaction()。add(R.id.person_information_layout,personInformation).commit();
(2)
此外,當我單擊TAB 1中的一行時,選項卡不會自動從TAB 1切換到TAB 2。
您正在此選項卡實現中使用viewpager。 因此,更改為tab2即可
viewPager.setCurrentItem(2);
注意:您缺少的是視圖分頁器,將上一頁和下一頁自動加載到特定頁面。 因此,當您位於tab1中時,tab2已被加載。 因此,當您單擊列表項時,您的tab2不會刷新,因為它已經加載。
我解決類似問題的方法是通過創建從活動到片段的回調方法以及從片段到活動的回調方法。 當我單擊fragment1列表中的一行時,我將信息保存在該fragment的參數中,並調用該活動的回調函數。 在該函數中,我檢索傳遞的信息並將其加載到fragment2的參數,然后調用fragment2的回調函數。 在那里,我檢索傳遞的信息並更新fragment2的列表。 然后,我在活動中調用tabLayout.getTabAt(newPosition)以重新顯示fragment2的頁面。 您還必須確保由於片段的視圖在頁面之間移動時被破壞,因此要檢查片段中是否仍填充了列表,以及是否不恢復列表的項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.