【问题标题】:ListView Inflater in BaseAdapter getView() methodBaseAdapter getView() 方法中的 ListView Inflater
【发布时间】:2014-12-25 17:23:42
【问题描述】:

我正在为 ListView 使用自定义适配器 (BaseAdapter) 来显示我的程序中的对象列表。我已经根据我在网上找到的教程 (http://www.codelearn.org/android-tutorial/android-listview) 实现了所有内容,但是在我的 Adapter 类的 getView() 方法中尝试设置 LayoutInflater 时出现错误。

public View getView(int arg0, View arg1, ViewGroup arg2) {
    if(arg1==null) {

       LayoutInflater inflater =(LayoutInflater)EventListActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       arg1 = inflater.inflate(R.layout.eventitem, arg2, false);
    }      

EventListActivity 是我所在的“MainActivity”:

public class EventListActivity extends Activity {

private ListView listview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.event_list);
    //setting adapter to event list view
    EventBaseAdapter eventadapter = new EventBaseAdapter();
    listview = (ListView)findViewById(R.id.eventlist);
    listview.setAdapter(eventadapter);


}

我在创建 LayoutInflater 的 Adapter 类中的“EventListActivity.this”部分出现错误,提示“在范围内无法访问 EventListActivity 类型的封闭实例”。我不知道这意味着什么,我很乐意听取你们的任何建议或帮助。

提前致谢!

【问题讨论】:

  • 您的适配器类与 EventListActivity 属于同一类?
  • 不,它们在两个不同的文件中。

标签: android listview android-listview baseadapter


【解决方案1】:

像这样创建一个构造函数 -

public CustomListAdapter(Activity activity, List<Movie> movieItems) {
        this.activity = activity;
        ...
    }

并且,使用 -

inflater = ( LayoutInflater )activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

这是因为您的适配器文件没有您的活动的任何引用;因此它无法获取布局充气服务。我们将 Activity 的实例传递给它的构造函数并在 CustomListAdapter 中使用它。

【讨论】:

  • 谢谢!构造函数的第二个参数列表是否必须有任何值?我在另一行代码中创建列表对象: List eventListItemsList = getDataForListView();在我的适配器类的开头。
  • 仅当您要在适配器中使用的列表也来自您的 Activity 类时才需要它。当您使用某些函数获取它时,即 getDataForListView(),所以应该没问题。如果它解决了您的问题,请将答案标记为已接受。
【解决方案2】:

创建 LayoutInflater 全局对象,以便您可以在其他自定义适配器和 getView() 方法上的用户 Inflater.inflat 方法中使用它。

这样

 public class EventListActivity extends Activity {

 private ListView listview;
 LayoutInflater inflater;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.event_list);

 //init inflater
 inflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

 //setting adapter to event list view
 EventBaseAdapter eventadapter = new EventBaseAdapter();
 listview = (ListView)findViewById(R.id.eventlist);
 listview.setAdapter(eventadapter);


}

并在您的代码中使用它..

public View getView(int arg0, View arg1, ViewGroup arg2) {
if(arg1==null) {


   arg1 = inflater.inflate(R.layout.eventitem, arg2, false);
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多