<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<RelativeLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<RelativeLayout
android:id="@+id/icon_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/icon_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fillAfter="false"
android:fillEnabled="false"
android:gravity="center_vertical">
<ImageView
android:id="@+id/bgcircle"
android:layout_width="40dp"
android:layout_height="40dp"/>
<ImageView
android:id="@+id/icdone"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/icon_front"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fillAfter="false"
android:fillEnabled="false"
android:gravity="center_vertical">
<ImageView
android:id="@+id/icon_profile"
android:layout_width="40dp"
android:layout_height="40dp"
app:srcCompat="@drawable/icon_contact"/>
<TextView
android:id="@+id/icon_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@android:color/white"
android:textSize="22dp"/>
</RelativeLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@+id/icon_container"
android:layout_toRightOf="@+id/icon_container"
android:orientation="vertical"
android:padding="5dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/stock_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_margin="2dp"
android:text="I00005"
android:textColor="#2aadff"/>
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:layout_margin="2dp"
android:text="150.00"
android:textColor="@android:color/black"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:maxLength="50"
android:maxLines="2"
android:text="JB.OfficePrint"
android:textColor="#2aadff"/>
<TextView
android:id="@+id/qty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="2dp"
android:layout_toEndOf="@id/name"
android:layout_toRightOf="@id/name"
android:gravity="right"
android:text="200"
android:textColor="@android:color/black"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/uom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:text="Manual"
android:textColor="#2aadff"/>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
<View
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/root"
android:background="#888989"/>
</RelativeLayout>
Java File:
public class MultiStockAdapter extends RecyclerView.Adapter<MultiStockAdapter.MyViewHolder> {
private Context mContext;
private List<String> messages;
private MessageAdapterListener listener;
private SparseBooleanArray selectedItems;
// array used to perform multiple animation at once
private SparseBooleanArray animationItemsIndex;
private boolean reverseAllAnimations = false;
List<Stock> stockArrayList;
// index is used to animate only the selected row
// dirty fix, find a better solution
private static int currentSelectedIndex = -1;
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
public TextView message;
public ImageView iconImp, imgProfile,bgcircle,icdone;
public LinearLayout messageContainer;
public RelativeLayout iconContainer, iconBack, iconFront, root;
public MyViewHolder(View view) {
super(view);
iconBack = (RelativeLayout) view.findViewById(R.id.icon_back);
iconFront = (RelativeLayout) view.findViewById(R.id.icon_front);
// iconImp = (ImageView) view.findViewById(R.id.icon_star);
imgProfile = (ImageView) view.findViewById(R.id.icon_profile);
bgcircle = (ImageView) view.findViewById(R.id.bgcircle);
icdone = (ImageView) view.findViewById(R.id.icdone);
root = (RelativeLayout) view.findViewById(R.id.root);
iconContainer = (RelativeLayout) view.findViewById(R.id.icon_container);
message = (TextView) view.findViewById(R.id.name);
view.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View view) {
listener.onRowLongClicked(getAdapterPosition());
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
}
}
public MultiStockAdapter(Context mContext, List<Stock> stockArrayList, MessageAdapterListener listener) {
this.mContext = mContext;
this.stockArrayList = stockArrayList;
this.listener = listener;
selectedItems = new SparseBooleanArray();
animationItemsIndex = new SparseBooleanArray();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext)
.inflate(R.layout.stock_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
String message = stockArrayList.get(position).getName();
// displaying text view data
// holder.icdone.setImageDrawable(AppCompatResources.getDrawable(mContext,R.drawable.ic_done_white_24dp));
//holder.bgcircle.setImageDrawable(AppCompatResources.getDrawable(mContext,R.drawable.bg_circle));
// holder.imgProfile.setImageDrawable(AppCompatResources.getDrawable(mContext,R.drawable.icon_contact));
// displaying the first letter of From in icon text
holder.message.setText(message);
// change the row state to activated
holder.itemView.setActivated(selectedItems.get(position, false));
// handle icon animation
applyIconAnimation(holder, position);
// display profile image
// apply click events
applyClickEvents(holder, position);
}
private void applyClickEvents(final MyViewHolder holder, final int position) {
holder.iconContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onIconClicked(position);
}
});
holder.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onIconClicked(position);
}
});
}
private void applyIconAnimation(MyViewHolder holder, int position) {
if (selectedItems.get(position, false)) {
holder.iconFront.setVisibility(View.GONE);
resetIconYAxis(holder.iconBack);
holder.iconBack.setVisibility(View.VISIBLE);
holder.iconBack.setAlpha(1);
holder.root.setBackgroundColor(ContextCompat.getColor(mContext, R.color.selectcolor));
if (currentSelectedIndex == position) {
FlipAnimator.flipView(mContext, holder.iconBack, holder.iconFront, true);
resetCurrentIndex();
}
} else {
holder.iconBack.setVisibility(View.GONE);
resetIconYAxis(holder.iconFront);
holder.iconFront.setVisibility(View.VISIBLE);
holder.iconFront.setAlpha(1);
if ((reverseAllAnimations && animationItemsIndex.get(position, false)) || currentSelectedIndex == position) {
FlipAnimator.flipView(mContext, holder.iconBack, holder.iconFront, false);
resetCurrentIndex();
}
holder.root.setBackgroundColor(ContextCompat.getColor(mContext, R.color.transparent));
}
}
// As the views will be reused, sometimes the icon appears as
// flipped because older view is reused. Reset the Y-axis to 0
private void resetIconYAxis(View view) {
if (view.getRotationY() != 0) {
view.setRotationY(0);
}
}
public void resetAnimationIndex() {
reverseAllAnimations = false;
animationItemsIndex.clear();
}
@Override
public int getItemCount() {
return stockArrayList.size();
}
public void toggleSelection(int pos) {
currentSelectedIndex = pos;
if (selectedItems.get(pos, false)) {
selectedItems.delete(pos);
animationItemsIndex.delete(pos);
} else {
selectedItems.put(pos, true);
animationItemsIndex.put(pos, true);
}
notifyItemChanged(pos);
}
public void clearSelections() {
reverseAllAnimations = true;
selectedItems.clear();
notifyDataSetChanged();
}
public int getSelectedItemCount() {
return selectedItems.size();
}
public List<Integer> getSelectedItems() {
List<Integer> items =
new ArrayList<>(selectedItems.size());
for (int i = 0; i < selectedItems.size(); i++) {
items.add(selectedItems.keyAt(i));
}
return items;
}
public List<Integer> selectAllitem() {
selectedItems.clear();
List<Integer> items =
new ArrayList<>(stockArrayList.size());
for (int i = 0; i < stockArrayList.size(); i++) {
items.add(i);
selectedItems.put(i, true);
}
notifyDataSetChanged();
return items;
}
private void resetCurrentIndex() {
currentSelectedIndex = -1;
}
public interface MessageAdapterListener {
void onIconClicked(int position);
void onRowLongClicked(int position);
}
public ArrayList<Stock> getMultiStock() {
List<Integer> items = getSelectedItems();
ArrayList<Stock> multistock = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
multistock.add(stockArrayList.get(items.get(i)));
}
return multistock;
}
}
我使用android studio 3.0并在recyclelerview中使用像gmail这样的动画,但运行时我得到错误inflateException
致命异常:主要android.view.InflateException:二进制XML文件行#0:在android.view.LayoutInflater.rInflate(LayoutInflater.java:android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762)中向类ImageView错误膨胀804)在android.view.LayoutInflater.rInflate(LayoutInflater.java:812)的android.view.LayoutInflater.rInflate(LayoutInflater.java:812),android.view.LayoutInflater.rInflate(LayoutInflater.java:812) . 位于mit.n.Adfter.inflate(LayoutInflater.java:526)的android.view.LayoutInflater.inflate(LayoutInflater.java:426)at mit.com.mm.zarlagamification.adapters.MultiStockAdapter.onCreateViewHolder(MultiStockAdapter.java:89)at mit android.support.v7.widget.RecyclerView上的android.support.v7.widget.RecyclerView $ Adapter.createViewHolder(RecyclerView.java:6365).com.mm.zarlagamification.adapters.MultiStockAdapter.onCreateViewHolder(MultiStockAdapter.java:26)在android.s上的$ Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5563) upport.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:5448)在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:5444)在android.support.v7.widget.LinearLayoutManager $在android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)的android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)上的LayoutState.next(LinearLayoutManager.java:2224) .support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)在android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3600)android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView) .java:3329)在Android.view.Viewout.Lout(ViewGroup,我在android.view.View.::::::????????????????????????????????????????? java:4793)在android.widget.FrameLayout.onLayout(FrameLayout.java:448)的android.view.View.layout(View.java:15213)atr ode.view.ViewGroup.layout(ViewGroup.java:4793)位于android.view.View.ViewGroup的android.view.View.layout(View.java:15213)的android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076) .layout(ViewGroup.java:4793)位于android.view.View.Loutout(ViewLayout.java:448)的android.view.View.layout(View.java:15213),位于android.view.ViewGroup.layout(ViewGroup . java:4793)在android.sview.View.Loutout(ActionBarOverlayLayout.java:437)android.view.View.layout(View.java:15213)android.view.ViewGroup.layout(ViewGroup.java)上的android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) :4793)android.widget.FrameLayout.onLayout(FrameLayout.java:448)android.view.View.layout(View.java:15213)android.view.ViewGroup.layout(ViewGroup.java:4793)at android .widget.LinearLayout.setChildFrame(LinearLayout.java:1677)位于android.view.View.View的android.widget.LinearLayout.onLayout(LinearLayout.java:1440)的android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531) . android.view.ViewGroup中的布局(View.java:15213) .layout(ViewGroup.java:4793)位于android.view.View.Loutout(ViewLayout.java:448)的android.view.View.layout(View.java:15213),位于android.view.ViewGroup.layout(ViewGroup . java:4793)在android.view.ViewRootImpl.performLversout(ViewRootImpl.java:2146)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1892)在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1131)at android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6286)at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:791)at android.view.Choreographer.doCallbacks(Choreographer.java:591)at android .view.Choreographer.doFrame(Choreographer.java:561)在android.view.Chore上的android.view.Handler.handleCallback(Handler.java:730)的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:777) . 在android.app.ActivityThread.main(ActivityThread.java:5493)的android.os.Looper.loop(Looper.java:177)上的Handler.dispatchMessage(Handler.java:92)