首页 文章

在活动的简历滚动时,Recycler视图崩溃了

提问于
浏览
-4

//我的RecyclerAdpater代码在这里:

public static final class ViewHolder extends RecyclerView.ViewHolder {
    ImageView ivProperty;
    ImageView ivEditProperty;
    ImageView ivDeleteProperty;
    ImageView ivPropTransHistory;
    ImageView ivInspectReport;
    TextView tvMaintenReqCount;
    TextView tvPropName;
    TextView tvPropAddr;
    TextView tvPropStatus;
    View view;

    public ViewHolder(View v) {
        super(v);
        //Initialize the variables
        ivProperty = (ImageView) v.findViewById(R.id.ivProperty);
        tvPropName = (TextView) v.findViewById(R.id.tvPropName);
        tvPropAddr = (TextView) v.findViewById(R.id.tvPropAddr);
        tvPropStatus = (TextView) v.findViewById(R.id.tvPropStatus);
        tvMaintenReqCount = (TextView) v.findViewById(R.id.tvMaintenReqCount);
        ivEditProperty = (ImageView) v.findViewById(R.id.ivEditProperty);
        ivPropTransHistory = (ImageView) v.findViewById(R.id.ivPropTransHistory);
        ivInspectReport = (ImageView) v.findViewById(R.id.ivInspectReport);
        ivDeleteProperty = (ImageView) v.findViewById(R.id.ivDeleteProperty);
        view = v;
    }
}

// Recycler adpter 

private final class PropertyRecyclerAdapter extends RecyclerView.Adapter<PropertyListActivity.ViewHolder> {

    final Context _context;
    List<PropertyListDTO> objects;

    public PropertyRecyclerAdapter(Context context, List<PropertyListDTO> objects) {
        this._context = context;
        this.objects = objects;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_property_list, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ViewHolder v = new ViewHolder(view);
        return v;
    }

    public void setFilter(List<PropertyListDTO> list) {
        objects = new ArrayList<PropertyListDTO>();
        objects.addAll(list);
        notifyDataSetChanged();
    }

    // bindview holder

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        // - get element from your data set at this position
        // - replace the contents of the view with that element
        String propImgUrl = "";
        final PropertyListDTO p = objects.get(position);
        // Load a bitmap from the drawable folder
        try {
            // set data value

            holder.tvPropName.setText(p.getPropertyName());
            holder.tvPropAddr.setText(p.getAddress());
            if (p.getInspectionReports() != null) {
                if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("0")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_0));
                    holder.ivInspectReport.setVisibility(View.GONE);
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("1")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_1));
                    holder.ivEditProperty.setVisibility(View.VISIBLE);
                    holder.ivInspectReport.setVisibility(View.GONE);
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("2")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_2));
                    holder.ivEditProperty.setVisibility(View.GONE);
                    holder.ivInspectReport.setVisibility(View.GONE); //holder.ivInspectReport.setVisibility(View.VISIBLE)
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("3")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_3));
                    holder.ivEditProperty.setVisibility(View.GONE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("4")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_4));
                    holder.ivEditProperty.setVisibility(View.VISIBLE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("5")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_5));
                    holder.ivEditProperty.setVisibility(View.GONE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("6")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_6));
                    holder.ivEditProperty.setVisibility(View.GONE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } else if (p.getInspectionReports() != null && p.getPropStatus().equalsIgnoreCase("7")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_7));
                    holder.ivEditProperty.setVisibility(View.GONE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } else {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_0));
                    holder.ivInspectReport.setVisibility(View.GONE);
                }
            } else {

                if (p.getPropStatus().equalsIgnoreCase("0")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_0));
                    holder.ivEditProperty.setVisibility(View.VISIBLE);
                    holder.ivInspectReport.setVisibility(View.GONE);
                } else if (p.getPropStatus().equalsIgnoreCase("1")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_1));
                    holder.ivEditProperty.setVisibility(View.VISIBLE);
                    holder.ivInspectReport.setVisibility(View.GONE);
                } else if (p.getPropStatus().equalsIgnoreCase("2")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_2));
                    holder.ivEditProperty.setVisibility(View.VISIBLE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } else if (p.getPropStatus().equalsIgnoreCase("3")) {
                    holder.tvPropStatus.setText(_context.getResources().getString(R.string.property_status_3));
                    holder.ivEditProperty.setVisibility(View.GONE);
                    holder.ivInspectReport.setVisibility(View.VISIBLE);
                } 


            holder.tvMaintenReqCount.setText("(" + p.getMaintenance_request_count() + ")");
            if (p.getGallery() != null && p.getGallery().size() > 0) {
                propImgUrl = AppConstants.property_Images_Path + p.getGallery().get(0).toString();
            }
            if (!TextUtils.isEmpty(propImgUrl)) {
                Picasso.with(context).load(propImgUrl).error(R.mipmap.home_profile).into(holder.ivProperty);
            } else {

            }

            android.util.Log.e("ImageUrl List =>", propImgUrl.toString());


        } catch (Exception e) {
            e.printStackTrace();
        }


        // click listener  View Property Detail                  

        holder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(context, ViewPropDetailsFragment.class);
                intent.putExtra("propDetails", p);
                startActivity(intent);
            }
        });


        // Edit Property Detail Info

        holder.ivEditProperty.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(PropertyListActivity.this, EditPropPrimDetailsActivity.class);
                intent.putExtra("propertyListDTO", p);
                startActivity(intent);

            }
        });


        holder.ivPropTransHistory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                PropertyTransactionFragment propertyTransactionFragment = new PropertyTransactionFragment();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Bundle bundle = new Bundle();
                bundle.putString("property_id", p.getId().get$id());
                bundle.putString("p_Id", p.getPropertyId());
                bundle.putString("property_name", p.getPropertyName());
                propertyTransactionFragment.setArguments(bundle);
                transaction.replace(R.id.container, propertyTransactionFragment);

                transaction.addToBackStack("propertyTransactionFragment");
                transaction.commit();
            }
        });

    }


    @Override
    public int getItemCount() {
        return objects.size();
    }
}

//日志错误是:

E / AndroidRuntime:FATAL EXCEPTION:main进程:com.excellenceit.propcare,PID:9927 java.lang.IndexOutOfBoundsException:检测到不一致 . 无效的项目位置4(偏移量:4).state:9在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:4957)在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView .java:4913)android.support的android.support.v7.widget.LinearLayoutManager $ LayoutState.next(LinearLayoutManager.java:2029)在android.support的android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414) . v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)位于android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)的android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java: 1043)在android.sview.View.dispatchTouchEvent上的android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1552)android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2649) .java:8968)在android.vi上的android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2698) ew.ViewGroup.dispatchTouchEvent(ViewGroup.java:2410)位于android.view.View.View.St.EvatchTouchEvent(ViewGroup.java:2709),位于android.view.ViewGroup.DispatchTransformedTouchEvent的android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) (ViewGroup.java:2709)位于android.view.View.View.StartEvent(ViewGroup.java:2709)的android.view.View.View.St上的android.view.View.St.EvatchTouchEvent(ViewGroup.java:2709)上的android.view.View . 2425)在android.view.View.View.St上的android.view.View.View.St上的android.view.View.View.StartEvent(ViewGroup.java:2709)的android.view.View.View.View.StartEvent(ViewGroup.java:2425)的android.view.View.View.St.EvatchTransformedTouchEvent(ViewGroup.java:2709) . 位于android.view.View.View.St.EvatchTouchEvent(ViewGroup.java:2709)的android.view.ViewGroup.DispatchTouchEvent(ViewGroup.java:2709)处于android.view.ViewGroup.DispatchTouchEvent(ViewGroup.java:2425)处于android.view.ViewGroup.dispatchTransformedTouchEvent的view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) (ViewGroup.java:2709)在android.v上位于android.view.View.View.St.EvatchTouchEvent(ViewGroup.java:2709)的android.view.View.D . (ViewGroup.java:2709)位于com.android的com.android.internal.policy.impl.PhoneWindow $ DecorView.superDispatchTouchEvent(PhoneWindow.java:2568)的android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) . android.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1776)位于android.sapp.Avent.dispatchTouchEvent(Activity.java:2866)的android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63) at com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:2529)at android.view.View.dispatchPointerEvent(View.java:9173)at android.view.ViewRootImpl $ ViewPostImeInputStage.processPointerEvent(ViewRootImpl) .java:4706)在android.view.ViewRootImpl $ ViewPostImeInput android.view.ViewRootImpl上的android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4068)上的Stage.onProcess(ViewRootImpl.java:4544)android.view.ViewRootImpl上的android.view.ViewRootImpl $ InputStage.onDeliverToNext(ViewRootImpl.java:4121) $ inputStage.forward(ViewRootImpl.java:4087)位于android.view上的android.view.ViewRootImpl $ AsyncInputStage.forward(ViewRootImpl.java:4201)android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:4095) . android.view.ViewRootImpl上的ViewRootImpl $ AsyncInputStage.apply(ViewRootImpl.java:4258)android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4068)android.view上的android.view.ViewRootImpl $ InputStage.onDeliverToNext(ViewRootImpl.java:4121) .ViewRootImpl $ InputStage.forward(ViewRootImpl.java:4087)在android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:4095)android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4068)at android . view.ViewRootImpl

2 回答

  • 0

    onBindViewHolder 中的位置存在问题,例如您的数据列表或数据数组可能没有该位置的任何数据 .

  • 0

    是的,最后我得到了上述问题的答案,并按照以下步骤操作:

    1)使用您的模型类创建临时列表作为arraylist .

    2)将templist分配给传递给RecyclerAdapter的arraylist .

    private List<PropertyListDTO> propertyList;
    List<PropertyListDTO> tempList = new ArrayList<>();
    

    //解析Json数据

    JSONArray array = obj.getJSONArray("properties");
     if (array.length() > 0) {
      Gson gson = new Gson();
      int i = 0;
      while (i < array.length()) {
      tempList.add(gson.fromJson(array.getJSONObject(i).toString(), PropertyListDTO.class));
      i++;
      }
    
      // assign the templist to the adpapterlist
    
      propertyList = tempList;
      if (propertyList.size() > 0) {
      mAdapter = new PropertyRecyclerAdapter(PropertyListActivity.this, propertyList);
      mRecyclerView.setAdapter(mAdapter);
    }
    }
    

    //使用此功能,RecyclerAdapter的索引会重新排列并平滑滚动 .

相关问题