2016-06-30 3 views
1

У меня есть адаптер recycliewiew с 3 текстовыми изображениями. Я использовал класс модели для установки текстов. Теперь я хочу использовать один и тот же адаптер с разным макетом и в другом классе, который имеет только 1 textview. Когда я попытался, я получил NullPointerException (может быть, потому что остальные 2 текстовых поля пустые). Есть ли способ использовать один и тот же адаптер с разным макетом и в разных классах?использовать такой же адаптер recyclerview с разным расположением

// 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; 
 
    } 
 
}

// 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); 
    } 
} 
+0

проверка исключения нулевого указателя, как если (время! = NULL), где и получение эта ошибка –

+0

попробуйте getItemType() в адаптере – naiyu

ответ

4

Вы можете использовать getItemViewType().

  1. Сделайте свой адаптер (здесь TimeLineAdapter) удлинителем RecyclerView.Adapter.
  2. Вы можете изменить Constructer на адаптере, чтобы получать ItemType и использовать его в getItemViewType
  3. Override методом int getItemViewType (int position) в адаптере.
  4. В onCreateViewHolder вы можете различать, какой макет вы хотите раздуть, используя параметр viewType.
  5. В onBindViewHolder использование instanceof чтобы проверить, какой ViewHolder был создан и вызов функции, связанные с связываемые

A Образец code-

// 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); 
    } 


} 
+0

Можно ли использовать разные макеты в разных классах? @Harshit – Sammy

+0

Да. Вы можете передать желаемое значение макета конструктору этого адаптера. – Harshit

+0

Большое спасибо. Я попробую. Пока я принимаю ваш ответ. :) – Sammy