代码之家  ›  专栏  ›  技术社区  ›  PRATEEK BHARDWAJ

为所有回收器视图适配器创建基本适配器

  •  6
  • PRATEEK BHARDWAJ  · 技术社区  · 6 年前
    public abstract class BaseAdapters extends RecyclerView.Adapter<BaseAdapters.MyViewHolder> implements View.OnClickListener {
    
        protected Context parentContext;
        public int layout_id;
        protected List<?> dataList = new ArrayList<>();
    
    
        public class MyViewHolder extends RecyclerView.ViewHolder  {
    
             MyViewHolder(View view) {
                super(view);
                declareViews(view,this);
            }
        }
    
        @Override
        public void onClick(View view) {
            onClickViews(view);
        }
    
        @Override
        public int getItemViewType(int position) {
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int i) {
            bindView(holder, i);
        }
    
        public void notifyList(List<?> filterdNames) {
            this.dataList = filterdNames;
            notifyDataSetChanged();
        }
    
        @Override
        public int getItemCount() {
            if (dataList.size() == 0)
                return 5;
            else
                return dataList.size();
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(layout_id, parent, false);
            return new MyViewHolder(itemView);
        }
    
        public abstract MyViewHolder bindView(MyViewHolder holder, int position);
    
        public abstract void onClickViews(View view);
    
        public abstract void declareViews(View view,MyViewHolder holder);
    
    }
    

    如何使用扩展子类中的holder来执行对每个项的单击选择。

    5 回复  |  直到 6 年前
        1
  •  6
  •   rupali mittal    6 年前
        import android.app.Activity;
        import android.content.Context;
        import android.support.annotation.NonNull;
        import android.support.v7.widget.RecyclerView;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
    
        import java.util.ArrayList;
        import java.util.List;
    
        public abstract class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.MyViewHolder> {
    
            public int layout_id;
            protected List<?> dataList = new ArrayList<>();
            Context BASE_CONTEXT;
            public View itemview;
    
            public BaseAdapter(Context context) {
                this.BASE_CONTEXT = context;
            }
    
            @NonNull
            @Override
            public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(layout_id, viewGroup, false);
                return new MyViewHolder(view);
            }
    
            @Override
            public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int position) {
                onBindViewHold(position, dataList.get(position));
            }
    
            public abstract View getView(View view);
    
            @Override
            public int getItemCount() {
                return dataList.size() == 0 ? 0 : dataList.size();
            }
    
    
            public abstract void onBindViewHold(int position, Object itemView);
    
            class MyViewHolder extends RecyclerView.ViewHolder {
    
    
                public MyViewHolder(@NonNull View itemView) {
                    super(itemView);
                    itemview = itemView;
                    getView(itemView);
                }
    
            }
    
            public <T extends View> T bind(int id) {
                return itemview.findViewById(id);
            }
    
    
        }
    
    public class Adapter extends BaseAdapter {
    
        TextView tv;
    
        Adapter(Context context, ArrayList<String> arrayList){
          super(context);
          dataList=arrayList;
          layout_id=R.layout.content_main2;
    
        }
    
    
        @Override
        public View getView(View view) {
            tv = bind(R.id.tv);
            return view;
        }
    
        @Override
        public void onBindViewHold( final int position, Object itemView) {
    
            String text=(String) itemView;
            Log.e("tv",tv.toString());
            tv.setText(text);
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(BASE_CONTEXT, ""+position, Toast.LENGTH_SHORT).show();
                }
            });
        }
    
    
    
    
    }
    
        2
  •  1
  •   user10169672 user10169672    6 年前

    您可以参考此示例适配器类并根据需要进行编辑:

    public class absadapter extends RecyclerView.Adapter<absadapter.exViewHolder> {
    
    List<abs.Ex> exList;
    Context context;
    
    
    
    
    absadapter(List exList) {
        this.exList= exList;
    
    }
    public static class exViewHolder extends RecyclerView.ViewHolder{
        CardView cardView;
        TextView exname;
        ImageView exlogo;
    
    
        exViewHolder(View itemView){
            super(itemView);
            cardView= itemView.findViewById(R.id.cardView);
            exname= itemView.findViewById(R.id.ex_name);
            exlogo=itemView.findViewById(R.id.exlogo);
    
    
    
        }
    
    
    }
    @Override
    public absadapter.exViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View viewthigh= LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_abslayout,parent,false);
        absadapter.exViewHolder evh=new absadapter.exViewHolder(viewthigh);
        return evh;
    
    
    }
    
    
    @Override
    public void onBindViewHolder(final absadapter.exViewHolder holder, final int position){
        holder.exname.setText(exList.get(position).name);
        holder.exlogo.setImageResource(exList.get(position).logoId);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (position == 0 ){
                    v.getContext().startActivity(new Intent(v.getContext(), abdetails.class));
    
                }
                if (position == 1) {
                    v.getContext().startActivity(new Intent(v.getContext(), declinecrunch.class));
    
    
                }
                if (position == 2) {
                    v.getContext().startActivity(new Intent(v.getContext(), dumsidebend.class));
    
    
                }
            }
        });
    
    
    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView){
        super.onAttachedToRecyclerView(recyclerView);
    }
    @Override
    public int getItemCount() {
        return  exList.size();
    }
    

    请参阅以下主类:

    public class abs extends AppCompatActivity {
    
    
    RecyclerView recyclerView;
    Context context;
    private List<Ex> exlist;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_abs);
    
        recyclerView= findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager layoutManager=new LinearLayoutManager(context);
        recyclerView.setLayoutManager(layoutManager);
    
        initializeData();
        initializeAdapter();
    
    
    }
    
    
    private void initializeData(){
    
        exlist=new ArrayList<>();
        exlist.add(new abs.Ex("Crunches",R.drawable.crunchesgif));
        exlist.add(new abs.Ex("Decline Crunch",R.drawable.declinecrunch));
        exlist.add(new abs.Ex("Dumbell Side Bends",R.drawable.dumbbellsidebend));
        exlist.add(new abs.Ex("Hanging Leg Raises",R.drawable.hanginglegraises));
        exlist.add(new abs.Ex("Incline Leg Raises",R.drawable.inclinelegraises));
        exlist.add(new abs.Ex("Kneeling Cable Crunch",R.drawable.cablecrunch));
        exlist.add(new abs.Ex("Legs Raises",R.drawable.legraises));
        exlist.add(new abs.Ex("Flat Bench Lying Leg Raises",R.drawable.flatbenchlyinglegraise));
        exlist.add(new abs.Ex("Seated Jack Knife",R.drawable.seatedjackknife));
        exlist.add(new abs.Ex("Twisting Hip Raise",R.drawable.twistinghipraise));
        exlist.add(new abs.Ex("Weighted Crunch",R.drawable.weightedcrunch));
        exlist.add(new abs.Ex("Plank",R.drawable.plank));
        exlist.add(new abs.Ex("Side Plank",R.drawable.sideplank));
        exlist.add(new abs.Ex("Superman",R.drawable.superman));
        exlist.add(new abs.Ex("Twist Crunch",R.drawable.twistcrunch));
    
    
    }
    public void initializeAdapter(){
        absadapter rvadapter=new absadapter(exlist);
        recyclerView.setAdapter(rvadapter);
    }
    class Ex{
        String name;
        int logoId;
    
        Ex(String name,int logoId){
            this.name=name;
            this.logoId=logoId;
        }
    
    }
    
        3
  •  1
  •   kamyar haqqani    6 年前

    重写在“BaseAdapters”的子类中处理click事件的方法应该可以做到这一点(根据您对其他帖子的评论,我假设bindView()处理click事件;覆盖您知道的处理单击事件的方法):

    class new_adapter extends BaseAdapters{
        //...
        @Override
        public MyViewHolder bindView(MyViewHolder holder, int position){
            //you could alter how click events are handled here.
        }
        //...
    }
    
        4
  •  1
  •   Khemraj Sharma    6 年前

    Java Generics .

    设置点击 onCreateViewHolder onClickViews 如果你需要职位或其他领域。

    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
        ..
        itemView.setOnClickListener(v -> onClickViews(itemView, dataList.get(position)));
        ..
    }
    

    public abstract void onClickViews(View view, T object);
    

    使用like

    public class SampleAdapter extends BaseAdapters<Item> {
    
        @Override
        public int getRowLayout() {
            return R.layout.row;
        }
    
        @Override
        public void onClickViews(View view, Item object) {
            // row clicked   
        }
    }
    

    我把你的课改了一点。

    public abstract class BaseAdapters<T> extends RecyclerView.Adapter<BaseAdapters.MyViewHolder> {
    
        protected List<T> dataList = new ArrayList<>();
    
        public class MyViewHolder extends RecyclerView.ViewHolder {
            MyViewHolder(View view) {
                super(view);
                declareViews(view, this);
            }
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int i) {
            bindView(holder, i);
        }
    
        public void notifyList(List<T> filteredNames) {
            dataList = filteredNames;
            notifyDataSetChanged();
        }
    
        @Override
        public int getItemCount() {
            return dataList.size();
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(getRowLayout(), parent, false);
            itemView.setOnClickListener(v -> onClickViews(itemView, dataList.get(position)));
            return new MyViewHolder(itemView);
        }
    
        public abstract @LayoutRes
        int getRowLayout();
    
        public abstract MyViewHolder bindView(MyViewHolder holder, int position);
    
        public abstract void onClickViews(View view, T object);
    
        public abstract void declareViews(View view, MyViewHolder holder);
    }
    
        5
  •  1
  •   Moumit    4 年前

    这是的扩展版本 rupali 回答,我发现回收问题 recycle-view viewholder 在项目上滚动时。所以如果需要的话你可以用下面的一个,

    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseRecyclerViewAdapter.BaseViewHolder> {
    
        public int layout_id;
        protected List<?> dataList = new ArrayList<>();
        protected BaseActivity Context;
    
    
    
        public BaseRecyclerViewAdapter(BaseActivity context) {
            this.Context = context;
        }
    
           @NonNull
        @Override
        public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(layout_id, viewGroup, false);
            return new BaseViewHolder(view);
        }
    
    
        @Override
        public void onBindViewHolder(@NonNull BaseViewHolder viewHolder, int position) {
            onViewHolderBind(viewHolder,position, dataList.get(position));
        }
    
        @Override
        public int getItemCount() {
            return dataList.size();
        }
    
        public abstract void onViewHolderBind(BaseViewHolder viewHolder, int position, Object data);
    
       public class BaseViewHolder extends RecyclerView.ViewHolder {
            public BaseViewHolder(@NonNull View itemView) {
                super(itemView);
            }
        }
    }
    

    使用

    public class LicenseListAdapter extends BaseRecyclerViewAdapter {
    
    
        public LicenseListAdapter(BaseActivity appLicensePlanActivity, List<LicenseRatePlanResponse> licenseRatePlanResponseData) {
            super(appLicensePlanActivity);
            dataList = licenseRatePlanResponseData;
            layout_id = R.layout.item_list_license_plan;
        }
    
    
        @Override
        public void onViewHolderBind(BaseViewHolder viewHolder, int position, Object data) {
            Button btnBuyButtonOfLicencePlaneILLP;
            TextView lblAmountOfLicencePlaneILLP, lblDayOfLicencePlaneILLP;
    
            lblAmountOfLicencePlaneILLP = viewHolder.itemView.findViewById(R.id.lblAmountOfLicencePlaneILLP);
            lblDayOfLicencePlaneILLP = viewHolder.itemView.findViewById(R.id.lblDayOfLicencePlaneILLP);
            btnBuyButtonOfLicencePlaneILLP = viewHolder.itemView.findViewById(R.id.btnBuyButtonOfLicencePlaneILLP);
    
            final LicenseRatePlanResponse tempLicensePlan = (LicenseRatePlanResponse) data;
    
            lblAmountOfLicencePlaneILLP.setText(KSUtility.GetFloatWithOutPrecesion(tempLicensePlan.getAmount()).toString() +" only");
            lblDayOfLicencePlaneILLP.setText(tempLicensePlan.getValidityDays().toString() +" days");
            btnBuyButtonOfLicencePlaneILLP.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    PaymentHelper.OpenPaymentDialog(Context, TransactionType.LicenseRenew, tempLicensePlan.getAmount(),tempLicensePlan.getLicenseRatePlanId());
                }
            });
        }
    }
    
        6
  •  0
  •   gStephin    6 年前

    基本回收适配器将是这样的

    public class BaseRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private final int BOTTOM_VIEW_TYPE = 3;
    
    private List<Object> listModels;
    private Context mContext;
    private OnItemClickListener onClickListener = null;
    
    public BaseRecyclerViewAdapter(Context context) {
        this.mContext = context;
    }
    
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
        View view;
        switch (viewType) {
        case BOTTOM_VIEW_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_bottomview_type, parent, false);
                return new ChildViewHolder(view);
        }
        return null;
    }
    
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        final Object model = listModels.get(position);
        if (model != null && model.getId() > 0) {
            ((BaseViewHolder) holder).bind(model, position);
        } else if (model != null) {
            ((TopViewViewHolder) holder).bind(model, position);
        }
    }
    
    @Override
    public int getItemViewType(int position) {
        if (listModels.get(position).getId() > 0) {
            return BASE_VIEW_TYPE;
        } else {
            return TOP_VIEW_TYPE;
        }
    }
    
    @Override
    public int getItemCount() {
        return null == listModels ? 0 : listModels.size();
    }
    
    
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onClickListener = onItemClickListener;
    }
    private class ChildViewHolder extends RecyclerView.ViewHolder {
        TextView tv_bottomName;
    
        BottomViewHolder(View v) {
            super(v);
            tv_bottomName = v.findViewById(R.id.tv_bottomName);
        }
    
        void bind(Object object, final int position) {
            tv_bottomName.setOnClickListener(view -> onClickListener.onItemClick(object, tv_bottomName, position));
    
        }
    }
    

    并使用mclicklistner的自定义接口

     public interface OnItemClickListener {
    void onItemClick(Object object, View view, int position);}
    

    并在活动或片段中实现listner