Android 在Adapter getView()方法中通过标记查找动态创建的TextView

Android 在Adapter getView()方法中通过标记查找动态创建的TextView,android,listview,textview,android-adapter,Android,Listview,Textview,Android Adapter,这是我的密码: @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; View rowView = convertView; LayoutInflater inflater = ((Activity) context).getLayoutInflater(); Planner

这是我的密码:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        View rowView = convertView;

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();

        PlannerMonth m = getItem(position);
        ArrayList<PlannerMonthDebt> debts = new ArrayList<PlannerMonthDebt>();
        debts = m.debtList;

        int debtSize = debts.size();

        if (rowView == null) {
            rowView = inflater.inflate(R.layout.row_planner_month, null, true);

            holder = new ViewHolder();
            holder.tv1 = (TextView) rowView.findViewById(R.id.tvPlannerMonth);
            holder.tv2 = (TextView) 

            holder.ll = (LinearLayout) rowView.findViewById(R.id.rlInnerDebtHolder);

            for (int i = 0; i < debtSize; i++) {
                View custom = inflater.inflate(R.layout.inner_debt_row, null);

                TextView tvName = (TextView) custom.findViewById(R.id.tvInnerDebtName);
                tvName.setTag(String.valueOf("tvName" + i));
                TextView tvPayment = (TextView) custom.findViewById(R.id.tvInnerDebtPayment);
                tvPayment.setTag(String.valueOf("tvPayment" + i));
                TextView tvDebt = (TextView) custom.findViewById(R.id.tvInnerDebtBalance);
                tvDebt.setTag(String.valueOf("tvDebt" + i));
                TextView tvBalance = (TextView) custom.findViewById(R.id.tvInnerDebtFee);
                tvBalance.setTag(String.valueOf("tvBalance" + i));

                holder.ll.addView(custom);
            }
            rowView.setTag(holder);
        } else {
            holder = (ViewHolder) rowView.getTag();
        }


        String month = m.date;
        String debtToal = m.debtTotal;
        String intTotal = m.intTotal;

        holder.tv1.setText(month);
        holder.tv2.setText(debtToal);
        // now inner debts

        int size = 0;
        for (PlannerMonthDebt d : debts) {

            TextView tvName = (TextView) convertView.findViewWithTag(String.valueOf("tvName" + size));
            tvName.setText(d.name);

            TextView tvPayment = (TextView) convertView.findViewWithTag(String.valueOf("tvPayment" + size));
            tvPayment.setText(d.payment);

            TextView tvDebt = (TextView) convertView.findViewWithTag(String.valueOf("tvDebt" + size));
            tvDebt.setText(d.balance);

            TextView tvBalance = (TextView) convertView.findViewWithTag(String.valueOf("tvBalance" + size));
            tvBalance.setText(d.fees);

            size++;       
        }   

        return rowView;
    }
我有一个线性布局(
holder.ll
),其中我添加了X个自定义行(基于上面粘贴的
内部债务行
布局)

我知道如何显示行,但我在使用
setTag()
查找和检索行时遇到了问题,因此我可以(通过
setText()
将值放入行中)

对于
标记
,我基本上为每个
文本视图
使用相同的名称,但也为名称添加了一个唯一的位置。我使用位置(或大小)使每个动态添加的文本字段在搜索时保持唯一

在我的
LogCat
中,我在这一行得到一个
NullPointer

TextView-tvName=(TextView)convertView.findViewWithTag(String.valueOf(“tvName”+size));

这是第一次为动态
TextView
赋值,因此我假设它们都找不到

如何通过
标记找到正确的TextView实例?

findViewWithTag()
代码看起来正确。是否检查
convertView
是否为空


convertView
在创建新行时将为空(即不重用上一行),但您只分配
rowView
,而不是
convertView

您在每个位置都有不同的
debtSize
。当
convertView!=null
和更少的
debtSize
时,您有
NullPointer
,当更多时,您有空文本视图。

正是这样。应该使用打字
rowView.findViewWithTag()
取而代之。谢谢!
<?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="horizontal" >

    <TextView
        android:id="@+id/tvInnerDebtName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="5dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/tvInnerDebtFee"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="5dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/tvInnerDebtPayment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="5dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/tvInnerDebtBalance"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>