如何将表外的textview与表行中的textview进行比较?

时间:2017-08-05 02:27:50

标签: android

   public void filter(TableLayout tl, String regex) {
       TableRow tr;
       TextView tv;
       Pattern p;
       Matcher m;

       p = Pattern.compile(regex);
       int n = tl.getChildCount();
       for (int i = 0; i < n; i++) {
           tr = (TableRow) tl.getChildAt(i);
           tv = (TextView) tr.getChildAt(0);
           m = p.matcher(tv.getText());
           if (m.find()) {
               tr.setVisibility(View.VISIBLE);
           } else {
               tr.setVisibility(View.GONE);
           }

我试图在aftertextchanged上为tablelayout做过滤。文本的值完全传递给filter方法,但是tv = (TextView) tr.getChildAt(0);给了我android.widget.LinearLayout不能强制转换为android.widget.TextView。由于大多数其他论坛显示textview有一个id,因为它是硬编码的,我没有设法找到一个解决动态放入textview的错误。下面是我添加到表格布局的一个示例,它可以很好地工作。

public void addData(ArrayList<Transactions> Transactions) {

        tl.removeAllViewsInLayout();
        addHeader();
        int j = 1;
        for (Iterator i = Transactions.iterator(); i.hasNext(); j++) {
            Transactions p = (Transactions) i.next();

            if (p.getAdminNo().equals(adminNo)) {

                /** Create a TableRow dynamically **/
                tr = new TableRow(this);

                /** Creating a TextView to add to the row **/
                label = new TextView(this);
                label.setText(String.valueOf(j));
                label.setId(p.getId());

                acd = String.valueOf(p.getId());
                label.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,
                        TableRow.LayoutParams.WRAP_CONTENT));
                label.setPadding(5, 5, 5, 5);
                label.setBackgroundColor(Color.GRAY);
                LinearLayout Ll = new LinearLayout(this);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,
                        TableRow.LayoutParams.WRAP_CONTENT);
                params.setMargins(5, 2, 2, 2);
                //Ll.setPadding(10, 5, 5, 5);
                Ll.addView(label, params);
                tr.addView((View) Ll); // Adding textView to tablerow.

这是我的xml文件。当我在我的edittext中添加一个值时,它将触发filter方法。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <EditText
        android:layout_width="134dp"
        android:layout_height="wrap_content"
        android:id="@+id/search"
        />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="244dp"
        android:layout_height="44dp"
        android:textColor="#00f0ff"
        />

    <ScrollView
        android:id="@+id/layout"
        android:layout_height="match_parent"
        android:scrollbars="horizontal|vertical"
        android:layout_width="match_parent"
        android:layout_marginTop="5dip"
        android:scrollbarStyle="outsideInset"
        android:fillViewport="true">

        <HorizontalScrollView
            android:id="@+id/horizontalView"
            android:layout_height="wrap_content"
            android:scrollbars="horizontal|vertical"
            android:layout_width="wrap_content"
            android:layout_marginTop="5dip">

            <TableLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/maintable" >
            </TableLayout>
        </HorizontalScrollView>
    </ScrollView>
</LinearLayout>

1 个答案:

答案 0 :(得分:0)

抛出强制转换异常的原因是因为要添加到表视图的第一个项目是linearlayout

Ll.addView(label, params); //adding textview to linearlayout
tr.addView((View) Ll); // Adding linearlayout to tablerow.

由于它只是一个你要添加到tablerow的项目,我不认为你需要linearlayout。你能做的是:

public void addData(ArrayList<Transactions> Transactions) {

    tl.removeAllViewsInLayout();
    addHeader();
    int j = 1;
    for (Iterator i = Transactions.iterator(); i.hasNext(); j++) {
        Transactions p = (Transactions) i.next();

        if (p.getAdminNo().equals(adminNo)) {

            /** Create a TableRow dynamically **/
            tr = new TableRow(this);

            /** Creating a TextView to add to the row **/
            label = new TextView(this);
            label.setText(String.valueOf(j));
            label.setId(p.getId());

            acd = String.valueOf(p.getId());
            label.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,
                    TableRow.LayoutParams.WRAP_CONTENT));
            label.setPadding(5, 5, 5, 5);
            label.setBackgroundColor(Color.GRAY);

            tr.addView((label); // Adding textView to tablerow.
    }
}

但是如果你必须添加linearlayout,你应该通过这样做取回textview

public void filter(TableLayout tl, String regex) {
   TableRow tr;
   TextView tv;
   Pattern p;
   Matcher m;

   p = Pattern.compile(regex);
   int n = tl.getChildCount();
   for (int i = 0; i < n; i++) {
       tr = (TableRow) tl.getChildAt(i);
       LinearLayout ll = (LinearLayout) tr.getChildAt(0);
       tv = (TextView) ll.getChildAt(0);
       m = p.matcher(tv.getText());
       if (m.find()) {
           tr.setVisibility(View.VISIBLE);
       } else {
           tr.setVisibility(View.GONE);
       }

这应该有效。希望它有所帮助,Goodluck