InvocationTargetException,同时尝试在listview适配器android中膨胀



我搜索了这个错误,但没有一个可以帮助我。我应该可以通过在适配器中设置 itemCount 来创建列表视图中的项目,但在适配器中膨胀布局时会出现此错误。

E/AndroidRuntime: FATAL EXCEPTION: main
                                               Process: com.digitronic.SmsController, PID: 25805
                                               android.view.InflateException: Binary XML file line #37: Binary XML file line #37: Error inflating class <unknown>
                                               Caused by: android.view.InflateException: Binary XML file line #37: Error inflating class <unknown>
                                               Caused by: java.lang.reflect.InvocationTargetException
                                                   at java.lang.reflect.Constructor.newInstance0(Native Method)
                                                   at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
                                                   at android.view.LayoutInflater.createView(LayoutInflater.java:652)
                                                   at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
                                                   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:724)
                                                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:792)
                                                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)
                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:865)
                                                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:525)
                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:378)
                                                   at com.digitronic.smscontroller.View.RelaysListAdapter.getView(RelaysListAdapter.java:90)
                                                   at android.widget.AbsListView.obtainView(AbsListView.java:3229)
                                                   at android.widget.ListView.makeAndAddView(ListView.java:2147)
                                                   at android.widget.ListView.fillDown(ListView.java:767)
                                                   at android.widget.ListView.fillFromTop(ListView.java:833)
                                                   at android.widget.ListView.layoutChildren(ListView.java:1900)
                                                   at android.widget.AbsListView.onLayout(AbsListView.java:2999)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                   at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1626)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                   at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                   at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                   at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                   at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                   at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                   at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                   at com.android.internal.policy.DecorView.onLayout(DecorView.java:822)
                                                   at android.view.View.layout(View.java:18799)
                                                   at android.view.ViewGroup.layout(ViewGroup.java:5952)
                                                   at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2634)   

这是我放入列表视图的片段:

package com.digitronic.smscontroller.View;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.digitronic.smscontroller.R;
import com.digitronic.smscontroller.View.Interface.IControllerActivity;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
 * Created by Ali Gadimi on 11/5/2017.
 */
public class RelaysFragment extends Fragment {
@InjectView(R.id.inputs_lv)ListView inputsLv;
private View mainView;
private IControllerActivity activity;
private RelaysListAdapter listAdapter;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mainView = inflater.inflate(R.layout.relays_tab, container, false);
    ButterKnife.inject(this, mainView);
    return mainView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    activity.relaysFragmentLoaded();
}
public void setParent(IControllerActivity activity)
{
    this.activity = activity;
}
public void addViews(int viewCount)
{
    listAdapter = new RelaysListAdapter(getActivity().getApplicationContext());
    listAdapter.setItemCount(viewCount);
    inputsLv.setAdapter(listAdapter);
}
}

这是relays_tab.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/third_gray">
<ListView
    android:id="@+id/inputs_lv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null" /></LinearLayout>

我的列表视图适配器:

package com.digitronic.smscontroller.View;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.digitronic.smscontroller.R;
import java.util.ArrayList;
/**
 * Created by Ali Gadimi on 11/7/2017.
 */
public class RelaysListAdapter extends BaseAdapter {
private int itemCount = 0;

private Context context;
private ArrayList<RelaysItem> items;
private LayoutInflater inflater;
public RelaysListAdapter(Context c)
{
    this.context = c;
    inflater = LayoutInflater.from(c);
}
public void setItems()
{
}
public void setItemCount(int count)
{
    this.itemCount = count;
}
public void updateViewIcon(int position, int iconResource)
{
    items.get(position).icon = iconResource;
    notifyDataSetChanged();
}
public void updateViewName(int position, String name)
{
    items.get(position).name = name;
    notifyDataSetChanged();
}
public void updateViewTimer(int position, int timerValue)
{
    items.get(position).time = timerValue;
    notifyDataSetChanged();
}
public void updateViewOnOff(int position, int inputState)
{
    items.get(position).inputState = inputState;
    notifyDataSetChanged();
}
@Override
public int getCount() {
    return itemCount;
}
@Override
public Object getItem(int position) {
    return null;
}
@Override
public long getItemId(int position) {
    return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null)
    {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.relay_item, null);
        holder.iconIv = (ImageView) convertView.findViewById(R.id.icon_iv);
        holder.nameTv = (TextView) convertView.findViewById(R.id.name_tv);
        holder.timerIb = (ImageButton) convertView.findViewById(R.id.timer_ib);
        holder.onBtn = (Button) convertView.findViewById(R.id.on_btn);
        holder.offBtn = (Button) convertView.findViewById(R.id.off_btn);
        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder) convertView.getTag();
    }
    RelaysItem item;
    if(items.size() == itemCount)
        item = items.get(position);
    else
        item = new RelaysItem();
    holder.iconIv.setImageResource(item.icon);
    holder.nameTv.setText(item.name.equals("") ? "Relay " + (position+1): item.name);
    setupTimerIb(holder.timerIb, position, item.time);
    setupOnOffBtn(holder.onBtn, holder.offBtn, position, item.inputState);
    return convertView;
}
private void setupTimerIb(ImageButton timerIb, int position, int timerValue)
{
    if (timerValue > 0)
        timerIb.setImageResource(R.drawable.timer_set);
    else
        timerIb.setImageResource(R.drawable.timer_unset);
    timerIb.setOnClickListener(new TimerIbOnClickListener(position));
}
private void setupOnOffBtn(Button onBtn, Button offBtn, int position, int inputState)
{
    if (inputState == 0)
    {
        onBtn.setTextColor(context.getResources().getColor(R.color.gray));
        ((FrameLayout) onBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
        offBtn.setTextColor(context.getResources().getColor(R.color.secondary_white));
        ((FrameLayout) offBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.off_state));
    }
    else if(inputState == 1)
    {
            onBtn.setTextColor(context.getResources().getColor(R.color.secondary_white));
            ((FrameLayout) onBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.on_state));
            offBtn.setTextColor(context.getResources().getColor(R.color.gray));
            ((FrameLayout) offBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
    }
    else if(inputState == -1)
    {
        onBtn.setTextColor(context.getResources().getColor(R.color.gray));
        ((FrameLayout) onBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
        offBtn.setTextColor(context.getResources().getColor(R.color.gray));
        ((FrameLayout) offBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
    }
    onBtn.setOnClickListener(new OnBtnOnClickListener(position));
    offBtn.setOnClickListener(new OffBtnOnClickListener(position));
}
private class TimerIbOnClickListener implements View.OnClickListener {
    private int position;
    TimerIbOnClickListener(int position){
        this.position = position;
    }
    @Override
    public void onClick(View v) {
        Toast.makeText(context, "Timer button click in position " + position, Toast.LENGTH_SHORT).show();
    }
}
private class OnBtnOnClickListener implements View.OnClickListener {
    private int position;
    OnBtnOnClickListener(int position){
        this.position = position;
    }
    @Override
    public void onClick(View v) {
        Toast.makeText(context, "On button click in position " + position, Toast.LENGTH_SHORT).show();
    }
}
private class OffBtnOnClickListener implements View.OnClickListener {
    private int position;
    OffBtnOnClickListener(int position){
        this.position = position;
    }
    @Override
    public void onClick(View v) {
        Toast.makeText(context, "Off button click in position " + position, Toast.LENGTH_SHORT).show();
    }
}

private class ViewHolder{
    ImageView iconIv;
    TextView nameTv;
    ImageButton timerIb;
    Button onBtn;
    Button offBtn;
}
}

列表视图项布局relay_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:background="@color/white"
android:elevation="1dp">
<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    app:layout_constraintLeft_toLeftOf="parent"
    android:id="@+id/icon_iv" />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@color/gray"
    android:textSize="18sp"
    app:layout_constraintLeft_toRightOf="@+id/icon_iv"
    android:layout_marginLeft="8dp"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_marginBottom="8dp"
    android:id="@+id/name_tv" />
<ImageButton
    android:id="@+id/timer_ib"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:scaleType="centerInside"
    android:src="@drawable/timer_unset"
    android:background="?attr/selectableItemBackground"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_marginBottom="8dp"
    app:layout_constraintRight_toLeftOf="@+id/linearLayout"
    android:layout_marginRight="16dp"/>
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dp"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:layout_marginBottom="8dp"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginTop="8dp"
    android:id="@+id/linearLayout">
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/third_gray">
        <Button
            android:id="@+id/on_btn"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="@string/on"
            android:textColor="@color/gray"
            android:textAllCaps="false"
            android:background="?attr/selectableItemBackground"/>
    </FrameLayout>
    <View
        android:layout_width="2dp"
        android:layout_height="50dp"
        android:background="@color/gray"/>
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/third_gray">
        <Button
            android:id="@+id/off_btn"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="@string/off"
            android:textColor="@color/gray"
            android:textAllCaps="false"
            android:background="?attr/selectableItemBackground"/>
    </FrameLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>

写这篇文章只是因为这里有一个错误,说它主要是在这个问题中编写的代码,并要求我添加更多细节,但我认为我已经说得足够多:D

以这种方式膨胀布局:

LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.relay_item, parent, false);

最新更新