如何在线性布局中标识一系列表格单元格的视图ID

时间:2013-02-25 11:02:50

标签: android listview textview

我正在使用自定义列表视图和固定标题行构建的表格网格 当用户单击其中一个固定标题单元格时,整个数据表将在该特定列上排序 我已经研究了如何通过将升序或降序箭头添加到现有标题/列标题来更改单击标题单元格的文本(请参阅下面的代码)。
但是,我还需要更改数据表中所有其他列标题单元格的文本,以便从其他标题单元格中删除任何现有的升序或降序箭头。

我遇到的问题是:如何在运行时找到其他列标题单元格的视图ID。

请注意,通过从xml布局中搜索特定的TextView ID,无法找到这些视图ID,因为所有表格标题单元格都是使用名为text1的通用TextView标识创建的(请参阅用于表格的线性布局代码)标题如下):

<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。

我需要添加代码以更改标记为“TODO”的部分中现有标题单元格的文本,一旦我可以识别其现有的TextView 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);
    }
    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;
}

2 个答案:

答案 0 :(得分:1)

我会让你的布局成为View的自定义子类。跟踪它的原始状态,以便稍后重置。然后将一个public reset()函数添加到新类中,该函数用初始值替换文本。最后,现在您不需要从适配器访问视图的内部属性。相反,你可以只在标题上调用reset(),它们将处理它们的内部状态。

答案 1 :(得分: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;
}