首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android ListView 適配器錯誤:getView 必須返回完整 Item 佈局而非單一 TextView

     編輯:程式設計疑難解答

錯誤代碼

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    textview = (TextView) findViewById(R.id.TextView); // 錯誤:在 Activity 佈局中找控件
    textview.setText("position:" + position);
    return textview; // 返回單一 TextView,非 Item 根佈局
}

問題

  1. findViewById 在 Activity 視圖樹中查找,而非 Item 佈局。
  2. 返回單一 TextView,ListView 期望的是包含所有子控件的根 ViewGroup(如 LinearLayout)。
  3. 未使用 convertView 複用,效能極差。

正確實現

// 1. 定義 item_layout.xml
// <LinearLayout ...> <TextView android:id="@+id/tvItem" /> </LinearLayout>

static class ViewHolder {
    TextView tvItem;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        holder = new ViewHolder();
        holder.tvItem = convertView.findViewById(R.id.tvItem);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.tvItem.setText("Position " + position);
    return convertView; // 返回根佈局
}

關鍵點

  • Item 佈局獨立 XML,根元素為 ViewGroup。
  • LayoutInflater.inflate(layoutId, parent, false) 參數 false 表示暫不附加到父視圖。
  • ViewHolder 模式避免重複 findViewById。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved