ヘッダー行が固定されたカスタムリストビューを使用して構築されたテーブルグリッドを使用しています。
ユーザーが固定ヘッダーセルの1つをクリックすると、データテーブル全体がその特定の列で並べ替えられます。
クリックしたヘッダーセルのテキストを変更する方法を、既存のヘッダー/列のタイトルに昇順または降順の矢印を追加することで解決しました(以下のコードを参照)。
ただし、他のすべてのヘッダーセルから既存の昇順または降順の矢印を削除するには、データテーブル内の他のすべての列ヘッダーセルのテキストも変更する必要があります。
私が抱えている問題は、実行時に他の列ヘッダーセルのビューIDを見つける方法です。
すべてのテーブルヘッダーセルはtext1と呼ばれる汎用TextViewIDを使用して作成されるため、xmlレイアウトから特定のTextView IDを検索してこれらのビューIDを見つけることはできないことに注意してください(以下のテーブルヘッダーに使用される線形レイアウトコードを参照)。 :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/item_table1_header"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
以下は、テーブルセルの作成に使用されるgetViewコードであり、組み込みのOnClickListenerも含まれています。固定テーブルヘッダーの行には-1の番号が付けられていることに注意してください。
既存のTextViewIDを識別できたら、「TODO」とマークされたセクションの既存のヘッダーセルのテキストを変更するコードを追加する必要があります。
@Override
public View getView(final int row, final int column, View converView, ViewGroup parent) {
if (converView == null) {
converView = inflater.inflate(getLayoutResource(row, column), parent, false);
}
setText(converView, getCellString(row, column));
converView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (row == -1) { // clicked on header row cell
for(int col=0; col<=getColumnCount(); col++){
if (col == column+1) {
if (getColOrder(col) == 0 || getColOrder(col) == 2) {
setText(v, getCellString(row, column) + " ↑"); // reset selected column header to ASC order
setColOrder(col, 1);
} else {
setText(v, getCellString(row, column) + " ↓"); // reset selected column header to DESC order
setColOrder(col, 2);
}
} else {
setColOrder(col, 0); // reset all other column headers to 0 (not ordered)
// TODO:
// here we need to change the text of all other header cells, using their view ids
}
}
}
}
});
return converView;
}