首页 文章

如何使用CursorRecyclerViewAdapter获取MultipleView Type?

提问于
浏览
0

我怀疑如何使用CursorRecyclerViewAdapter如何使用multipleView Type我可以使用这两个布局,但我只获得第一项的 Headers 而不是所有项目如何做到目前为止我尝试的是:

import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;

import java.util.List;

import model.CustomerModel;
import timertracker.precision.timetracker.R;
import timertracker.precision.timetracker.RecyclerViewFastScroller;

public class CustomerListAdapter extends CursorRecycleViewAdapter<CustomerListAdapter.ViewHolder>  implements View.OnClickListener , RecyclerViewFastScroller.BubbleTextGetter{
    int position;
    Cursor cursor;
    ColorGenerator generator = ColorGenerator.MATERIAL;
    private OnItemClickListener onItemClickListener;
    List<CustomerModel>list;
    public static final int ITEM_TYPE_NORMAL = 1;
    public static final int ITEM_TYPE_HEADER = 0;    

    public CustomerListAdapter(Context mContext, Cursor cursor) {
        super(mContext, cursor);    
    }

    public void setOnItemClickListener(final OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @Override
    public String getTextToShowInBubble(int pos) {
        return Character.toString(cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_Name)).charAt(0));
    }

    public static class MyViewHolder extends ViewHolder {
        TextView textname;
        TextView status;
        TextView textphnum;
        TextView textdegree;
        TextView textemail;
        ImageView call;
        TextView header;
        public MyViewHolder(final View itemView) {
            super(itemView);
                this.textname = (TextView) itemView.findViewById(R.id.subject);
                this.status = (TextView) itemView.findViewById(R.id.customerstatus);
                this.textemail = (TextView) itemView.findViewById(R.id.username);
                this.textdegree = (TextView) itemView.findViewById(R.id.status);
                this.call = (ImageView) itemView.findViewById(R.id.imageView);    
        }
    }

    public static class Headers extends ViewHolder {
      TextView header;
        public Headers(final View itemView) {
            super(itemView);
            this.header = (TextView) itemView.findViewById(R.id.header); 

        }
    }
    @Override
    public int getItemViewType(int position) {
      if(position==ITEM_TYPE_NORMAL)
        return 1;

        return 0;    
    }

  public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View v) {
            super(v);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
        if(viewType==ITEM_TYPE_NORMAL){
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.customeradapterview, parent, false);

        MyViewHolder myViewHolder = new MyViewHolder(view);
        view.setOnClickListener(this);
        return myViewHolder;
        }
        else if(viewType==ITEM_TYPE_HEADER){
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.header, parent, false);
             Headers headers = new Headers(view);
             return headers;
        }
        return null;
    }    

    @Override
    public void onBindViewHolder(ViewHolder holder, Cursor cursor) {
           String  customrename = cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_Name));
        String email=cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_EmailID));
        if(holder.getItemViewType()==1) {
            MyViewHolder holders=(MyViewHolder)holder;
            TextView textViewName = holders.textname;
            TextView textstatus = holders.status;
            TextView textphnumbr = holders.textdegree;
            TextView textemail=holders.textemail;
          //  ImageView call=holders.call;
            if (email.length() >= 20) {
                String s = email.substring(0, 20) + "...";
                textemail.setText(s);
            } else {
                textemail.setText(email);
            }
            //textemail.setText(cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_EmailID)));
            String status = cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_Status));
            if (status.equals("Active")) {
                textstatus.setTextColor(Color.parseColor("#006400"));
            } else {
                textstatus.setTextColor(Color.parseColor("#8B0000"));
            }
            textstatus.setText(status);
            textphnumbr.setText(cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_MobileNumber)));
            String s1 = customrename.substring(0, 1).toUpperCase() + customrename.substring(1).toLowerCase();
            textViewName.setText(s1);
            ColorGenerator generator = ColorGenerator.DEFAULT;
            String com = s1.substring(0, 1);
            TextDrawable drawable = TextDrawable.builder()
                    .buildRound((com).toUpperCase(), generator.getRandomColor());
            holders.call.setImageDrawable(drawable);

        }
        else if(holder.getItemViewType()==0) {
            Headers header=(Headers)holder;
            String s1 = customrename.substring(0, 1).toUpperCase() + customrename.substring(1).toLowerCase();
            String com = s1.substring(0, 1);
            header.header.setText(com);    
        }
    }

    @Override
    public void onClick(View v) {
        final RecyclerView recyclerView = (RecyclerView) v.getParent();
        position = recyclerView.getChildLayoutPosition(v);
        if (position != RecyclerView.NO_POSITION) {
            final Cursor cursor = this.getItem(position);
            this.onItemClickListener.onItemClicked(cursor);
        }    
    }

    public interface OnItemClickListener {
        void onItemClicked(Cursor cursor);
    }    
}

如何获得所有项目的recyclerview Headers 我该如何实现这一目标 .

如果我在OnbindViewHolder中删除条件,这是我的Logcat消息:

FATAL EXCEPTION:main进程:timertracker.precision.timetracker,PID:28124 java.lang.ClassCastException:Adapters.CustomerListAdapter $ Headers无法转换为Adapters.CustomerListAdapter $ MyViewHolder,位于Adapters.CustomerListAdapter.onBindViewHolder(CustomerListAdapter.java:123)at Adapters.CustomerListAdapter.onBindViewHolder(CustomerListAdapter.java:26)位于android.support的android.support.v7.widget.RecyclerView $ Adapter.onBindViewHolder(RecyclerView.java:5471)上的Adapters.CursorRecycleViewAdapter.onBindViewHolder(CursorRecycleViewAdapter.java:77) .v7.widget.RecyclerView $ Adapter.bindViewHolder(RecyclerView.java:5504)在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:4741)在android.support.v7.widget.RecyclerView $ Recycler .getViewForPosition(RecyclerView.java:4617)位于android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.ja)的android.support.v7.widget.LinearLayoutManager $ LayoutState.next(LinearLayoutManager.java:1994) va:1390)在android.support.v7.widget.LineoutLayoutManager.fill(LinearLayoutManager.java:1353)的android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)android.support.v7.widget .RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)在android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)的android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)at at android.view.Viewout中的android.view.View.layout(View.java:14845)安卓android.view.layout(ViewGroup.java:4631)android.view.Loutout(ViewL.::::::: .layout(View.java:14845)位于Android.widget.LinearLayout.setoutVertical的android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)上的android.view.ViewGroup.layout(ViewGroup.java:4631)(LinearLayout . java:1525)在android.view.Layout.onLayout(LinearLayout.java:1434)android.view.View.layout(View.java:14845)android.view.ViewGroup.layout(ViewGroup.java:4631)的android.widget.LinearLayout.onLayout在android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:122)的android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)android.support.design.widget.AppBarLayout $ ScrollingViewBehavior .onLayoutChild(AppBarLayout.java:1192)位于android.view.ViewGroup的android.view.View.layout(View.java:14845)的android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:814) . Android.widget.FoutLayout.onLayout(FrameLayout.java:388)android.view.layout(View.java)的android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)布局(ViewGroup.java:4631) :14845)在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)的android.view.Linout.setoutVertical(LinearLayout.java:1525)的android.view.ViewGroup.layout(ViewGroup.java:4631) android.view.ViewGroup.l上的android.view.View.layout(View.java:14845)中的.widget.LinearLayout.onLayout(LinearLayout.java:1434) ayout(ViewGroup.java:4631)在Android.widget.FrameLayout.onout中的android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)处于android.view.View.layout(View.java)的android.widget.FrameLayout.onLayout(FrameLayout.java:388) :14845)在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)的android.view.Linout.setoutVertical(LinearLayout.java:1525)的android.view.ViewGroup.layout(ViewGroup.java:4631) .widget.LinearLayout.onLayout(LinearLayout.java:1434)位于android.view.View.Loutout(View.java:14845)的android.view.Viewout上的android.view.View.layout(ViewGroup.java:4631) . layoutChildren(FrameLayout.java:453)位于android.view.View.Loutout(ViewLayout.java:388)的android.view.View.layout(View.java:14845)android.view.ViewGroup.layout(ViewGroup.java) :4631)在android.view.ViewRootImpl.performLversout(ViewRootImpl.java:2033)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1790)android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1046)at android . 争夺w.Vie

1 回答

  • 0

    这是完整的解决方案:

    public static final int HEADER_VIEW = 0;
            public static final int NORMAL_VIEW = 1;
    private String headerName="";
    
        getItemViewType(Cursor cursor) { 
        //Based on your Header and Item view condition return either the header view or normal view.
     String  customrename = cursor.getString(cursor.getColumnIndex(CustomerModel.Customer_Name));
         String s1 = customrename.substring(0, 1).toUpperCase() + customrename.substring(1).toLowerCase();
                String headerNameTemp = s1.substring(0, 1);
                 if(headerNameTemp.equals(headerName))
    {
    return NORMAL_VIEW; 
    }
    else
    {
    headerName=headerNameTemp;
    return HEADER_VIEW; 
    }
    } 
    
        @Override 
        public int getItemViewType(int position) { 
            Cursor cursor = (Cursor) getItem(position); 
            return getItemViewType(cursor); 
        }
    

    希望它会有所帮助 .

相关问题