使用具有不同布局的相同recyclerview适配器

时间:2016-06-30 06:56:08

标签: android android-recyclerview recycler-adapter

我有一个带有3个textviews的recyclerview适配器。我用模型类来设置文本。现在我想使用具有不同布局的相同适配器和不同的类,只有1个textview。当我尝试时,我得到NullPointerException(可能是因为其他2个textviews是空白的)。有没有办法使用不同布局和不同类别的相同适配器?



// second class - I used 1 textview 

public class Customers extends AppCompatActivity{

    private CShowProgress cShowProgress;
    private RecyclerView mRecyclerView;
    private TimeLineAdapter mTimeLineAdapter;
    private List<TimeLineModel> mDataList = new ArrayList<>();
    private static final String CUSTOMERS = "http://192.168.200.3/ubooktoday/android/showspacustomerlist";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.customers);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        cShowProgress = CShowProgress.getInstance();

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(getLinearLayoutManager());
        mRecyclerView.setHasFixedSize(true);

        showCustomers();
    }

    private void showCustomers() {

        if(mDataList!=null )mDataList.clear();

        cShowProgress.showProgress(Customers.this);

        StringRequest stringRequest = new StringRequest(Request.Method.POST, CUSTOMERS,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        cShowProgress.hideProgress();

                        try {

                            JSONArray jsonArray = new JSONArray(response);

                            for(int i=0; i<jsonArray.length(); i++){
                                JSONObject obj = jsonArray.getJSONObject(i);

                                TimeLineModel model = new TimeLineModel();

                                model.setCustname(obj.getString("customername"));

                                mDataList.add(model);
                                mTimeLineAdapter = new TimeLineAdapter(getApplicationContext(), R.layout.item_row_customer, mDataList);
                                mRecyclerView.setAdapter(mTimeLineAdapter);
                            }


                            mTimeLineAdapter.notifyDataSetChanged();





                        } catch (JSONException e) {
                            // JSON error
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), "VolleyError" + error.toString(), Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();

                params.put("spaid", "145");
                return params;
            }

        };

        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest);
    }


    private LinearLayoutManager getLinearLayoutManager() {

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        return linearLayoutManager;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                break;
        }
        return true;
    }
}
&#13;
&#13;
&#13;

// first class - I used all 3 textviews

public class Walkin extends Fragment{

    private RecyclerView mRecyclerView;
    private TimeLineAdapter mTimeLineAdapter;
    private List<TimeLineModel> mDataList = new ArrayList<>();
    private static final String DASHBOARD = "My API";

    @Nullable
    @Override
  @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.walkin, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(getLinearLayoutManager());
        mRecyclerView.setHasFixedSize(true);

        showDashboard();
    }

    private void showDashboard() {

        if(mDataList!=null )mDataList.clear();

        cShowProgress.showProgress(getActivity());

        StringRequest stringRequest = new StringRequest(Request.Method.POST, DASHBOARD,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {


                        try {
                            JSONObject jsonObject = new JSONObject(response);

                            JSONArray jsonArray = jsonObject.getJSONArray("walkinlist");

                            for(int i=0; i<jsonArray.length(); i++){
                                JSONObject obj = jsonArray.getJSONObject(i);

                                TimeLineModel model = new TimeLineModel();

                                model.setCustname(obj.getString("customername"));
                                model.setTime(obj.getString("serviceDuration"));
                                model.setServname(obj.getString("service"));

                                mDataList.add(model);
                                mTimeLineAdapter = new TimeLineAdapter(getActivity(), R.layout.item_row_dashboard, mDataList);
                                mRecyclerView.setAdapter(mTimeLineAdapter);
                            }


                            mTimeLineAdapter.notifyDataSetChanged();





                        } catch (JSONException e) {
                            // JSON error
                            e.printStackTrace();
                            Toast.makeText(getActivity(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getActivity(), "VolleyError" + error.toString(), Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();

                params.put("spaid", "145");
                return params;
            }

        };

        RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);
    }


    private LinearLayoutManager getLinearLayoutManager() {

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        return linearLayoutManager;

    }
}
// Adapter class

public class TimeLineAdapter extends RecyclerView.Adapter<TimeLineViewHolder> {

    private List<TimeLineModel> mFeedList;
    int resource;
    private Context mContext;

    public TimeLineAdapter(Context mContext, int resource, List<TimeLineModel> feedList) {

        this.resource = resource;
        this.mContext = mContext;
        mFeedList = feedList;
    }


    @Override
    public TimeLineViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = View.inflate(parent.getContext(), resource, null);
        return new TimeLineViewHolder(view, viewType);
    }

    @Override
    public void onBindViewHolder(TimeLineViewHolder holder, int position) {

        TimeLineModel timeLineModel = mFeedList.get(position);

        holder.servicename.setText(timeLineModel.getServname());
        holder.custname.setText(timeLineModel.getCustname());
        holder.time.setText(timeLineModel.getTime());

    }

    @Override
    public int getItemCount() {
        return (mFeedList!=null? mFeedList.size():0);
    }


}
// ViewHolder class

public class TimeLineViewHolder extends RecyclerView.ViewHolder {
    public TextView servicename, custname, time;

    public TimeLineViewHolder(View itemView, int viewType) {
        super(itemView);
        servicename = (TextView) itemView.findViewById(R.id.tv_service);
        custname = (TextView) itemView.findViewById(R.id.tv_cust);
        time = (TextView) itemView.findViewById(R.id.tv_time);
    }
}

1 个答案:

答案 0 :(得分:6)

您可以使用getItemViewType()

  1. 使您的适配器(此处为TimeLineAdapter)仅扩展RecyclerView.Adapter
  2. 您可以更改适配器的构造函数以接收ItemType并在getItemViewType
  3. 中使用它
  4. Override适配器中的int getItemViewType (int position)方法。
  5. 在onCreateViewHolder中,您可以使用viewType参数来区分要扩展的布局。
  6. onBindViewHolder中使用instanceof检查创建了哪个ViewHolder并调用相关的绑定函数
  7. 示例代码 -

        // Adapter class
    public class TimeLineAdapter extends RecyclerView.Adapter{
    .....
    int type;
    
        public TimeLineAdapter(Context mContext, int resource, List<TimeLineModel> feedList,int layoutType) {
        .....
         .....
        type=layoutType;
        }
    
         @Override
        public int getItemViewType(int position) {
            return type;
        }
    
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(viewType==1){
                    View view = View.inflate(parent.getContext(), resource, null);
                    return new TimeLineViewHolder(view, viewType);
            }else{
                View view = View.inflate(parent.getContext(), resource, null);
                return new TimeLineViewHolder2(view, viewType);
            }
         }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
            if(holder instanceof TimeLineViewHolder){   
    
                    TimeLineModel timeLineModel = mFeedList.get(position);
    
                  ((TimeLineViewHolder)  holder).servicename.setText(timeLineModel.getServname());
                ......
            }
            else if(holder instanceof TimeLineViewHolder2){
                ....
                ....
            }
    
        }
    
        @Override
        public int getItemCount() {
            return (mFeedList!=null? mFeedList.size():0);
        }
    
    
    }