2011-12-28 31 views
16

Ngay bây giờ để điền GridViews của tôi, tôi đang sử dụng lớp BaseAdapter mở rộng trên mỗi Hoạt động Android của tôi (hầu hết trong số đó).Android: BaseAdapter và getLayoutInflater trên tệp lớp riêng biệt

Để dễ đọc và bảo trì hơn, tôi đang cố gắng đặt tất cả mã BaseAdapter vào một tệp lớp riêng biệt.

Để cư GridView, Tôi đang sử dụng LayoutInflater, và đây là nơi thứ trở nên khó khăn ...

Kể từ khi getLayoutInflater() xuất phát từ android.Activity, nó chỉ sẽ không làm các trick. Tôi đã thử làm cho Adapter.java của tôi (lớp để điền vào GridViews) một lớp Activity mở rộng, và sau đó bên trong tạo lớp BaseAdapter (cách tôi làm nó ngay bây giờ), nhưng tôi đã không thể làm cho nó hoạt động đúng.

Sau đây là cách Adapter.java trông:

//Adapter.java 
package com.cimp.matitec; 

import greendroid.app.GDActivity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class Adapter extends GDActivity{ 

public class ImageAdapter extends BaseAdapter 
{ 
    Context MyContext; 
    int count; 
    String[] nombre; 

    public ImageAdapter(Context _MyContext, int n, String[] nombre) 
    { 
     MyContext = _MyContext; 
     count = n; 
     this.nombre = nombre; 
    } 

    public int getCount() 
    { 
        /* Set the number of element we want on the grid */ 
     return count; 
    } 

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

     if (convertView == null) 
     { 
     /*we define the view that will display on the grid*/ 

     //Inflate the layout 
     LayoutInflater li = getLayoutInflater(); 
     MyView = li.inflate(R.layout.grid_item, null); 

     // Add The Text!!! 
     TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text); 
     tv.setText(nombre[position]+""); 

     // Add The Image!!!   
     ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image); 
     iv.setImageResource(R.drawable.ic_launcher); 
     } 

     return MyView; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 
} 

Để gọi nó từ bên ngoài, tôi làm như sau:

//MainClass.java 
Adapter MyGridAdapter = new Adapter(); 
MyGrid = (GridView)findViewById(R.id.grid); 
MyGrid.setAdapter(MyGridAdapter.new ImageAdapter(this, 6, nombreTema)); 

Ứng dụng chạy, nhưng khi cố gắng để cư trú, tôi nhận được một NullPointerException getLayoutInflater().

Ai đó biết tôi đang thiếu gì hoặc làm cách nào để hoạt động bình thường?

+0

GDActivity có mở rộng 'Activity' không? – Squonk

+0

Yup, là Hoạt động Greendroid –

+0

Từ quan điểm OO, Bộ điều hợp không phải là Hoạt động, mã của bạn không hợp lý. Bạn tìm kiếm sự đơn giản nhưng kết thúc với thời gian và sự phức tạp, cách Google đề xuất có thể không hoàn hảo nhất, nhưng đó là cách hợp lý và hiệu quả nhất, ít nhất là IMO. – yorkw

Trả lời

45

Có nhiều cách để nhận đối tượng LayoutInflater hơn trực tiếp từ số Activity. Như một vấn đề của thực tế, getLayoutInflater() có lẽ chỉ là một phương pháp thuận tiện cho việc này:

LayoutInflater li = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

Xin xem tài liệu cho LayoutInflater.

+0

Tôi đã làm và thử một cái gì đó tương tự khi bắt đầu, dunno lý do tại sao nó không làm việc thời gian đó, nhưng bây giờ nó :). Cảm ơn rất nhiều. –

3

đọc này ...

Application Fundamentals

... đặc biệt là các bit trên hoạt động trong phần Application Components.

KHÔNG cố gắng tạo nhanh Activity sử dụng new. An Activity là một trường hợp Android đặc biệt và KHÔNG nên được coi như một lớp Java thông thường. An Activity chỉ nên bắt đầu sử dụng Intent và đó là trách nhiệm của hệ điều hành Android để khởi tạo nó.

Nói cách khác, không bao giờ làm điều này ...

Adapter MyGridAdapter = new Adapter(); 

Ngoài ra, Adapter là tên của một lớp Widget Android để không phải là một lựa chọn tốt cho các tên của một trong các lớp học của riêng bạn.

EDIT: Cũng xem câu trả lời của tôi cho câu hỏi này here về việc tạo ra một lớp helper và đi qua các hoạt động của Context với nó.

+0

Im đã làm điều đó, tôi gửi bối cảnh cho BaseAdapter ... Vấn đề là tôi nhận được 'Phương thức getLayoutInflater() là không xác định cho kiểu ImageAdapter', đó là lý do tại sao Im mở rộng Hoạt động –

+0

Bạn rõ ràng không đọc nhận xét cho câu trả lời của tôi, nơi tôi giải thích cho người khác sử dụng 'mContext.getSystemService (...)' trong trường hợp của anh ta. Điều tương tự cũng áp dụng cho 'MyContext' của bạn (bắt đầu bằng chữ cái viết thường theo quy ước). Bạn có thể sử dụng 'MyContext.getLayoutInflater()' cách khác 'getApplicationContext(). GetLayoutInflater()' sẽ hoạt động. Dù bằng cách nào, không bao giờ cố gắng để khởi tạo một 'Hoạt động' với' mới'. – Squonk

+0

Tôi đã đọc những gì bạn đăng và thử nó ... Tôi đang cố gắng 'LayoutInflater li = MyContext.getLayoutInflater();' (Tôi sẽ sửa các trường hợp sau, vì một số mã không phải của tôi) và nó cho thấy 'Phương thức getLayoutInflater() là không xác định cho kiểu Context' –

1

bạn nên vượt qua bối cảnh của MainActivity khi tạo một đối tượng của lớp mà kéo dài baseadapter cái gì đó như LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

này

này sẽ đúc MyContext đến một hoạt động và sau đó GetLayoutInflater() có thể được gọi !!

2

Cách tốt nhất là sử dụng phương pháp tĩnh LayoutInflator đối tượng với ngữ cảnh ứng dụng làm tham số duy nhất để có được inflator.

Các vấn đề liên quan