Reputation: 13
It really bothered a lot.
When I use TintImageView or FloatingActionButton in any isolate activities or fragments, they all goes well.
But when I use them in RecyclerView, there comes out this exception: android.view.InflateException:
android.view.InflateException: Binary XML file line #79: Error inflating class "unknown"
Here is the complete edition:
5882-5882/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.*********, PID: 5882
android.view.InflateException: Binary XML file line #79: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:640)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:775)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
at android.view.LayoutInflater.inflate(LayoutInflater.java:512)
at android.view.LayoutInflater.inflate(LayoutInflater.java:409)
at com.*********.ui.adapters.CreditList_MineAdapter.onCreateViewHolder(CreditList_MineAdapter.java:33)
at com.*********.ui.adapters.CreditList_MineAdapter.onCreateViewHolder(CreditList_MineAdapter.java:23)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5288)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4551)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1962)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1371)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1334)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:563)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2847)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3145)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:581)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1697)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1551)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1460)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1697)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1551)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1460)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:14878)
at android.view.ViewGroup.layout(ViewGroup.java:4655)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1697)
at android.widget.LinearLayout.layoutVertical
OK I'll post my source code.
Here is my gradle:
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.*******"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:palette-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
...
}
And RecyclerView item layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
android:id = "@+id/card_root"
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:card = "http://schemas.android.com/apk/res-auto"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:background = "?android:attr/selectableItemBackground"
card:cardBackgroundColor = "#F1CC9D"
card:cardCornerRadius = "0dp"
card:cardElevation = "4dp"
card:cardPreventCornerOverlap = "true"
card:cardUseCompatPadding = "true"
card:contentPadding = "4dp">
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "vertical"
android:weightSum = "100">
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "32dp">
<TextView
android:id = "@+id/text_name"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layout_gravity = "left|center_vertical"
android:gravity = "center_vertical"
android:maxLines = "2"
android:paddingLeft = "8dp"
android:paddingRight = "8dp"
android:singleLine = "true"
android:text = "****\n****"
android:textColor = "@color/primary_dark_material_dark"
android:textSize = "16sp"
android:textStyle = "bold"/>
</FrameLayout>
<View
android:layout_width = "match_parent"
android:layout_height = "1dp"
android:layout_gravity = "bottom"
android:layout_marginLeft = "8dp"
android:layout_marginRight = "8dp"
android:background = "#7B030B"/>
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "32dp"
android:orientation = "horizontal"
android:weightSum = "2">
<RelativeLayout
android:layout_width = "0dp"
android:layout_height = "32dp"
android:layout_weight = "1">
<android.support.v7.widget.CardView
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_margin = "4dp"
android:layout_weight = "128"
card:cardBackgroundColor = "@android:color/transparent"
card:cardElevation = "-2dp">
<android.support.v7.internal.widget.TintImageView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:src = "@mipmap/ic_today_black_48dp"
android:tint = "?attr/colorPrimaryDark"/>
</android.support.v7.widget.CardView>
<TextView
android:id = "@+id/text_deadline"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_alignParentRight = "true"
android:layout_centerVertical = "true"
android:gravity = "right|center_vertical"
android:paddingLeft = "8dp"
android:paddingRight = "8dp"
android:text = "2015-01-01"
android:textColor = "@color/primary_dark_material_dark"
android:textSize = "16sp"/>
</RelativeLayout>
<RelativeLayout
android:layout_width = "0dp"
android:layout_height = "32dp"
android:layout_weight = "1">
<android.support.v7.widget.CardView
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_margin = "4dp"
android:layout_weight = "128"
card:cardBackgroundColor = "@android:color/transparent"
card:cardElevation = "-2dp">
<android.support.v7.internal.widget.TintImageView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:src = "@mipmap/ic_credit_card_black_48dp"
android:tint = "?attr/colorPrimaryDark"/>
</android.support.v7.widget.CardView>
<TextView
android:id = "@+id/text_credit"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_alignParentRight = "true"
android:layout_centerVertical = "true"
android:gravity = "right|center_vertical"
android:paddingLeft = "8dp"
android:paddingRight = "8dp"
android:text = "0987654321"
android:textColor = "#7B020B"
android:textSize = "16sp"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "32dp"
android:orientation = "horizontal"
android:weightSum = "2">
<RelativeLayout
android:layout_width = "0dp"
android:layout_height = "32dp"
android:layout_weight = "1">
<android.support.v7.widget.CardView
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_margin = "4dp"
android:layout_weight = "128"
card:cardBackgroundColor = "@android:color/transparent"
card:cardElevation = "-2dp">
<android.support.v7.internal.widget.TintImageView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:src = "@mipmap/ic_assignment_ind_white_48dp"
android:tint = "?attr/colorPrimaryDark"/>
</android.support.v7.widget.CardView>
<TextView
android:id = "@+id/text_postedby"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_alignParentRight = "true"
android:layout_centerVertical = "true"
android:gravity = "right|center_vertical"
android:paddingLeft = "8dp"
android:paddingRight = "8dp"
android:text = "null"
android:textColor = "@color/primary_dark_material_dark"
android:textSize = "16sp"/>
</RelativeLayout>
<RelativeLayout
android:layout_width = "0dp"
android:layout_height = "32dp"
android:layout_weight = "1">
<android.support.v7.widget.CardView
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_margin = "4dp"
android:layout_weight = "128"
card:cardBackgroundColor = "@android:color/transparent"
card:cardElevation = "-2dp">
<android.support.v7.internal.widget.TintImageView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:src = "@mipmap/ic_local_grocery_store_white_48dp"
android:tint = "?attr/colorPrimaryDark"/>
</android.support.v7.widget.CardView>
<TextView
android:id = "@+id/text_usedby"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_alignParentRight = "true"
android:layout_centerVertical = "true"
android:gravity = "right|center_vertical"
android:paddingLeft = "8dp"
android:paddingRight = "8dp"
android:text = "null"
android:textColor = "@color/primary_dark_material_dark"
android:textSize = "16sp"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id = "@+id/image"
android:layout_width = "100dp"
android:layout_height = "100dp"
android:layout_gravity = "right|top"
android:layout_margin = "8dp"
android:src = "@mipmap/ic_seal_used"
android:visibility = "gone"/>
</android.support.v7.widget.CardView>
And RecyclerView Adapter goes like this:
public class CreditList_MineAdapter
extends BaseRecyclerAdapter< CreditList_MineAdapter.CreditViewHolder, Credit > {
public CreditList_MineAdapter ( Context context, ArrayList< Credit > list ) {
super( context, list );
}
@Override
public CreditViewHolder onCreateViewHolder ( ViewGroup parent, int viewType ) {
CreditViewHolder holder = new CreditViewHolder(
LayoutInflater.from( mContext )
.inflate( R.layout.listitem_credit_list_mine, parent, false )
);
return holder;
}
@Override
protected void onBindViewHolderBase ( CreditViewHolder holder, int position ) {
final Credit mCreditAtPosition = mList.get( position );
holder.mTextView_Name.setText( mCreditAtPosition.getName() );
holder.mTextView_Credit.setText( mCreditAtPosition.getCredit() );
try {
holder.mTextView_End.setText(
mCreditAtPosition.getDeadLineDate() == null ? "" : Credit.YYYY_MM_DD.format(
Credit.YYYY_MM_DD.parse( mCreditAtPosition.getDeadLineDate().getDate() )
)
);
}
catch ( ParseException e ) {
e.printStackTrace();
}
holder.mTextView_PostBy.setText(
mCreditAtPosition.getPostedBy() == null ? "" :
TextUtils.isEmpty( mCreditAtPosition.getPostedBy().getUsername() ) ?
mCreditAtPosition.getPostedByName() :
mCreditAtPosition.getPostedBy().getUsername()
);
holder.mTextView_UsedBy.setText(
mCreditAtPosition.getUsedBy() == null ? "" :
TextUtils.isEmpty( mCreditAtPosition.getUsedBy().getUsername() ) ?
mCreditAtPosition.getUsedByName() :
mCreditAtPosition.getUsedBy().getUsername()
);
if ( mCreditAtPosition.isUsed() ) {
holder.mCardView.setCardBackgroundColor( R.color.material_design_colors_grey_500 );
holder.mImageView.setVisibility( View.VISIBLE );
holder.mImageView.setImageResource( R.mipmap.ic_seal_used );
return;
}
if ( mCreditAtPosition.isOutOfDate() ) {
holder.mCardView.setCardBackgroundColor( R.color.material_design_colors_grey_600 );
holder.mImageView.setVisibility( View.VISIBLE );
holder.mImageView.setImageResource( R.mipmap.ic_seal_outofdate );
return;
}
holder.mCardView.setCardBackgroundColor( Color.parseColor( "#F1CC9D" ) );
holder.mImageView.setVisibility( View.GONE );
}
class CreditViewHolder extends RecyclerView.ViewHolder {
@InjectView ( R.id.text_name )
TextView mTextView_Name;
@InjectView ( R.id.text_credit )
TextView mTextView_Credit;
@InjectView ( R.id.text_deadline )
TextView mTextView_End;
@InjectView ( R.id.text_postedby )
TextView mTextView_PostBy;
@InjectView ( R.id.text_usedby )
TextView mTextView_UsedBy;
@InjectView ( R.id.card_root )
CardView mCardView;
@InjectView ( R.id.image )
ImageView mImageView;
public CreditViewHolder ( View view ) {
super( view );
ButterKnife.inject( this, view );
}
}
}
The error log pointed at this line:
CreditViewHolder holder = new CreditViewHolder( LayoutInflater.from( mContext ) .inflate( R.layout.listitem_credit_list_mine, parent, false ) );
I've tried some similar questions on SOF but none of them can solve my problem like this. So I hope someone can give me a hint? Thanks a lot!
Sorry for my bad English!
Sorry I forgot to metion that my device os is Android 4.4.2 API19 .
edited:
In addition, the code in fragment
mList = new ArrayList< Credit >();
switch (mPosition) {
case POSITION_0_FRESH:
mAdapter =
new CreditList_FreshAdapter( getActivity().getApplicationContext(), mList );
mAdapter.setRecyclerViewOnItemClickLitener( this );
break;
case POSITION_1_USED:
case POSITION_2_USEDBYME:
mAdapter =
new CreditList_UsedAdapter( getActivity().getApplicationContext(), mList );
break;
case POSITION_3_POSTBYME:
mAdapter =
new CreditList_MineAdapter( getActivity().getApplicationContext(), mList );
break;
case POSITION_4_OUTOFDATE:
mAdapter = new CreditList_OutofDateAdapter(
getActivity().getApplicationContext(), mList
);
break;
default:
mAdapter =
new CreditList_FreshAdapter( getActivity().getApplicationContext(), mList );
break;
}
mRecyclerView.setAdapter( mAdapter );
mRecyclerView.setLayoutManager( new LinearLayoutManager( getActivity() ) );
And the BaseRecyclerAdapter goes like this:
public abstract class BaseRecyclerAdapter < VH extends RecyclerView.ViewHolder, T >
extends RecyclerView.Adapter< VH > {
protected Context mContext;
protected List< T > mList;
protected RecyclerViewOnItemClickLitener mRecyclerViewOnItemClickLitener;
public BaseRecyclerAdapter ( Context inContext, List< T > inList ) {
this.mContext = inContext;
this.mList = inList;
}
public T getItemAtPosition ( int inPosition ) {
if ( mList != null ) {
return mList.get( inPosition );
}
return null;
}
public void setRecyclerViewOnItemClickLitener (
RecyclerViewOnItemClickLitener mRecyclerViewOnItemClickLitener
) {
this.mRecyclerViewOnItemClickLitener = mRecyclerViewOnItemClickLitener;
}
@Override
public void onBindViewHolder ( final VH holder, int position ) {
onBindViewHolderBase( holder, position );
if ( mRecyclerViewOnItemClickLitener != null ) {
holder.itemView.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick ( View v ) {
if ( mRecyclerViewOnItemClickLitener != null )
mRecyclerViewOnItemClickLitener.onItemClick(
holder.itemView, holder.getLayoutPosition()
);
}
}
);
holder.itemView.setOnLongClickListener(
new View.OnLongClickListener() {
@Override
public boolean onLongClick ( View v ) {
if ( mRecyclerViewOnItemClickLitener != null )
mRecyclerViewOnItemClickLitener.onItemLongClick(
holder.itemView, holder.getLayoutPosition()
);
return false;
}
}
);
}
}
protected abstract void onBindViewHolderBase ( VH holder, int position );
@Override
public int getItemCount () {
return mList == null ? 0 : mList.size();
}
}
Upvotes: 1
Views: 4102
Reputation: 871
Not working for me.
@Override
public ViewHolders onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, viewGroup, false);
return new ViewHolders(v);
}
Working for me
public ViewHolders onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, viewGroup, false);
return new ViewHolders(v);
}
just put MainActivity.this instead of getApplicationContext()
Upvotes: 0
Reputation: 306
android:background="?attr/selectableItemBackground"
caused couple inflating problems if it is not necessary just remove it and try it again
or
try all together
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
Upvotes: 6
Reputation: 1551
I think you have not initialised the mContext Variable.Initialise it within the CreditList_MineAdapter() constructor as mContext=context.Try this.Hope it might help.
Upvotes: 0