【问题标题】:BaseAdapter getLayoutInflater giving runtime exceptionBaseAdapter getLayoutInflater 给出运行时异常
【发布时间】:2015-07-28 06:09:56
【问题描述】:

我有一个班级发布了JobHistory(片段):

public class PostedJobHistory extends Fragment {
    String employerName;
    private List<ParseObject> jobDetails;
    Context context;
    public PostedJobHistory() {}
    public PostedJobHistory(Context context, String employerName) {
        this.context = context;
        this.employerName = employerName;
    }
    ListView listViewJobHistory;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View jobsView = inflater.inflate(R.layout.fragment_posted_job_history, container, false);
        listViewJobHistory = (ListView) jobsView.findViewById(R.id.listViewJobHistory);

        if(jobDetails==null){
            jobDetails=new ArrayList<ParseObject>();
            EmployerHistory jobsQuery=new EmployerHistory();
            jobDetails = jobsQuery.getJobHistory(employerName);
        }

        listViewJobHistory.setAdapter(new TimelineList(context, jobDetails));

        return jobsView;
    }
}

对于适配器,我在与上面相同的 .java 文件中有这个类:

class TimelineList extends BaseAdapter {
    private List<ParseObject> elements;
    Context mContext;
    public TimelineList(Context mContext, List<ParseObject> elements) {
        this.mContext = mContext;
        this.elements = elements;
    }


    @Override
    public int getCount() {
        return elements.size();
    }

    @Override
    public ParseObject getItem(int position) {
        return elements.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

//this line is giving runtime exception
            LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
            View row;
            row = inflater.inflate(R.layout.job_history_listitem, parent, false);
            TextView title, detail;
            title = (TextView) row.findViewById(R.id.title);
            detail = (TextView) row.findViewById(R.id.detail);
            title.setText(getItem(position).get("JobName").toString());
            title.setMovementMethod(LinkMovementMethod.getInstance());
            detail.setText(getItem(position).get("updatedAt").toString());
            return (row);
        }
    }

07-28 02:06:12.424 17392-17392/com.example.ankit.job_depot E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.example.ankit.job_depot,PID:17392 java.lang.ClassCastException: android.app.Application 不能转换为 android.app.Activity 在 com.example.ankit.job_depot.TimelineList.getView(PostedJobHistory.java:80) 在 android.widget.AbsListView.obtainView(AbsListView.java:2347) 在 android.widget.ListView.measureHeightOfChildren(ListView.java:1270) 在 android.widget.ListView.onMeasure(ListView.java:1182) 在 android.view.View.measure(View.java:17547) 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:727) 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463) 在 android.view.View.measure(View.java:17547) 在 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1455) 在 android.view.View.measure(View.java:17547) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)

here Context 不能被强制转换为 Activity,因为它不是它的子类。我不确定如何解决这个问题。

【问题讨论】:

  • 将上下文更改为适配器中的活动
  • java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity 很清楚。

标签: java android listview android-listview


【解决方案1】:

这是错误的

public PostedJobHistory(Context context, String employerName) {
    this.context = context;
    this.employerName = employerName;
}

片段应该没有参数构造函数

其次,您可以使用getActivity() 获取活动上下文 onCreateView

listViewJobHistory.setAdapter(new TimelineList(getActivity(), jobDetails));

然后在你的适配器的构造函数中

LayoutInflate inflater;
public TimelineList(Context mContext, List<ParseObject> elements) {
    inflater = LayoutInflater.from(mContext);
    this.elements = elements;
}

如果您需要将数据从活动传递到片段

Send data from activity to fragment in android

您还应该使用ViewHolder 模式

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

注意:Fragment 的所有子类都必须包含一个公共的无参数构造函数。

来源:

http://developer.android.com/reference/android/app/Fragment.html

【讨论】:

  • 谢谢,这就是我要找的。感谢您指出如何将数据从活动传递到片段,android studio 发出警告,但我发出危险信号,但我不知道该怎么做。非常感谢!!!
  • @Bharthan 我希望你没有 arg 构造函数。检查编辑的答案
【解决方案2】:

您必须尝试将getApplicationContext() 而不是Activity 传递给fragment 的构造函数。尝试传递活动实例而不是应用程序上下文。

PostedJobHistoryconstructor,使用this传递父活动实例

【讨论】:

  • this 不会帮助导致this 指的是Fragment。 op 也有带有构造函数的 Fragment。这是一个更大的错误
  • 我没有告诉在片段构造函数中添加“this”。从活动代码中,他正在创建这个片段实例。
  • 但适配器已在片段中初始化
  • 很好。如果他将活动实例传递给构造函数,上下文将持有它。在这种情况下,适配器将只有该活动引用,因为他正在将上下文传递给适配器跨度>
  • 片段的构造函数??
【解决方案3】:

您正在将 Context 转换为 Activity,这就是您收到错误的原因。

请在构造函数的参数中传递Activity而不是Context

Activity mActivity ;
    public TimelineList(Activity mActivity, List<ParseObject> elements) {
        this.mActivity= mActivity;
        this.elements = elements;
    }

【讨论】:

  • java.lang.Object ↳ android.content.Context ↳ android.content.ContextWrapper ↳ android.view.ContextThemeWrapper ↳ android.app.Activity
猜你喜欢
  • 2018-01-17
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多