2

ヘッダー行が固定されたカスタムリストビューを使用して構築されたテーブルグリッドを使用しています。
ユーザーが固定ヘッダーセルの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;
}
4

2 に答える 2

1

私はあなたのレイアウトをViewの独自のカスタムサブクラスにします。後でリセットできるように、元の状態を追跡します。次に、public reset()関数を新しいクラスに追加して、テキストを初期値に置き換えます。最後に、アダプタからビューの内部プロパティにアクセスする必要がなくなりました。代わりに、ヘッダーでreset()を呼び出すだけで、内部状態が処理されます。

于 2013-02-25T11:58:48.283 に答える
0

テーブルヘッダーのタイトルセルを更新するために、ビューIDの割り当て、保存、および識別に関する上記の問題の解決策を見つけました。ソリューションで更新された作業コードは次のとおりです。

@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);
        if (row == -1){
            converView.setId(column+2);         // assign new id to the cell view
            setHeaderId(column);        // store that view id in the header array
        }  
    }
    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) {  // check if col = clicked column
                      if (getColOrder(col) == 0  ||  getColOrder(col) == 2) {    // 0 = not ordered, 1 = +" ↑"  ASC,  2 = +" ↓"  DESC
                          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 {                    
                        int viewId = getHeaderId(col);                              // extract view id from the header array
                        if (viewId > 0) {                                           // to prevent updating header cells with unassigned view Id's
                            ViewGroup parent = (ViewGroup)v.getParent();            // parent = TableFixHeaders
                            View tv = parent.findViewById(viewId);                      
                            setText(tv, getCellString(row, col-1));      // update the header cell text with the original text string (from header text array)
                            setColOrder(col, 0);   // reset all other column headers to 0 (= not ordered)
                        }
                    }
                }

        }
    });     

    return converView;
}
于 2013-02-28T07:02:58.020 に答える