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

Android ListView 自定義項目佈局:R.layout 引用錯誤導致找不到 xml 文件

     編輯:程式設計綜合問答

使用自定義佈局 mytext.xml 作為 ArrayAdapter 項目佈局時,代碼寫 android.R.layout.mytext 導致編譯錯誤「找不到符號」。原因:android.R 是系統資源,自項目資源在 R.layout (包名.R)。

錯誤代碼


// ❌ 錯誤:android.R.layout 只有系統內置佈局 (simple_list_item_1 等)
ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.mytext, historyList);

正確代碼


// ✅ 正確:項目資源在 com.example.myapp.R.layout.mytext
// 確保導入了項目包名的 R 類,而非 android.R
import com.example.myapp.R; // 你的包名

ArrayAdapter adapter = new ArrayAdapter<>(this, R.layout.mytext, historyList);

完整實現

1. 自定義項目佈局 res/layout/mytext.xml




2. Activity 中使用


public class HistoryActivity extends AppCompatActivity {
    private ListView listView;
    private List historyList = Arrays.asList("記錄1", "記錄2", "記錄3");
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_history);
        
        listView = findViewById(R.id.listView);
        
        // 關鍵:使用 R.layout.mytext (項目資源)
        ArrayAdapter adapter = new ArrayAdapter<>(
            this, 
            R.layout.mytext, // 這裡!
            historyList
        );
        listView.setAdapter(adapter);
    }
}

3. 進階:自定義 Adapter 支援複雜佈局 (多 TextView、ImageView)


// 佈局 res/layout/item_history.xml

    
    
    


// 自定義 Adapter
public class HistoryAdapter extends ArrayAdapter {
    public HistoryAdapter(Context context, List items) {
        super(context, R.layout.item_history, items);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_history, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        String item = getItem(position);
        holder.title.setText(item);
        holder.time.setText(new SimpleDateFormat("HH:mm").format(new Date()));
        return convertView;
    }
    
    static class ViewHolder {
        TextView title, time;
        ImageView icon;
        ViewHolder(View v) {
            title = v.findViewById(R.id.title);
            time = v.findViewById(R.id.time);
            icon = v.findViewById(R.id.icon);
        }
    }
}

R 類導入常見錯誤對比

導入語句含義能訪問 mytext.xml?
import android.R;系統框架資源❌ 否
import com.example.myapp.R;項目應用資源✅ 是
import com.example.myapp.databinding.R;ViewBinding 生成類 (不同)❌ 否

避坑指南

  1. 刪除錯誤導入:IDE 自動導入可能誤選 android.R,手動修正為項目包名。
  2. 2. 清理重建:Build → Clean Project → Rebuild Project 刷新 R 類。 3. 檢查資源文件名:小寫字母、下劃線、無中文、無保留字。 4. 現代開發用 ViewBinding:ItemHistoryBinding.inflate(inflater) 類型安全、無 R 類導入煩惱。

核心原則:自項目資源永遠在 包名.R,系統資源在 android.R。這是 Android 資源系統的基石區分。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved