2015-10-28 5 views
0

Я реализую приложение для чата, как приложение, когда я получаю сообщение, которое я хочу обновить количество непрочитанных сообщений для этого конкретного чата.Получить позиции позиции позиции для повторного использования по тегу?

Я использую просмотр recycler для отображения контактов, теперь, когда я получаю push-уведомление для чата, мне нужно обновить непрочитанное сообщение строки, как показано ниже.

enter image description here

Если пользователь щелкает по любому из пункта я могу получить представление, но я могу получить элемент представления утилизатора динамически

Если я знаю позицию я могу получить, но здесь пользователь обыкновения нажать на любом строки, мне нужно обновить конкретную строку динамически. Я думал установить тег для каждой строки, но я не знаю, как получить строку на основе ее тега.

Заранее спасибо

обновленный код:

public class JobsFragmentRecyclerViewAdapter extends RecyclerView.Adapter<JobsFragmentRecyclerViewAdapter.JobsViewHolder> { 


    private List<PdJob> jobs; 


    public JobsFragmentRecyclerViewAdapter(List<PdJob> jobs){ 
     this.jobs = jobs; 
    } 


    public void sortByCustomerName(){ 
     Comparator<PdJob> myComparator = new Comparator<PdJob>() { 
      public int compare(PdJob obj1,PdJob obj2) { 
       if(obj1.userName != null && obj2.userName != null){ 
        return obj1.userName.compareTo(obj2.userName); 
       } 
        return 0; 
      } 
     }; 

     Collections.sort(jobs,myComparator); 
     this.notifyDataSetChanged(); 
    } 

    public void sortByModel(){ 
     Comparator<PdJob> myComparator = new Comparator<PdJob>() { 
      public int compare(PdJob obj1,PdJob obj2) { 
       if(obj1.jobCarName != null && obj2.jobCarName != null){ 
        return obj1.jobCarName.compareTo(obj2.jobCarName); 
       } 
        return 0; 
      } 
     }; 

     Collections.sort(jobs,myComparator); 
     this.notifyDataSetChanged(); 
    } 


    @Override 
    public JobsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View partnerTypeView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false); 
     JobsViewHolder jobsViewHolder = new JobsViewHolder(partnerTypeView); 
     return jobsViewHolder; 
    } 

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

     final PdJob pdJob = jobs.get(position); 
     holder.mView.setTag(pdJob.jobId); 
     holder.consumerName.setText(pdJob.userName); 
     holder.jobIdNumber.setText(pdJob.jobId); 
     holder.consumerVehicle.setText(pdJob.jobCarName); 
     holder.typeOfService.setText(pdJob.serviceType); 
     holder.registrationNumber.setText(pdJob.regNo); 
     if(NotificationManager.checkJobChatExists(pdJob.jobId)) { 
      holder.textNumber.setText("" + NotificationManager.getJobNotificationCount(pdJob.jobId)); 
     } 
     else { 
      holder.textNumber.setText("0"); 
     } 
     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //screen navigation 
      } 
     }); 

     holder.chatButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //screen navigation 
      } 
     }); 

    } 

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

    static class JobsViewHolder extends RecyclerView.ViewHolder{ 

     @InjectView(R.id.registration_number) 
     TextView registrationNumber; 

     @InjectView(R.id.job_id_number) TextView jobIdNumber; 

     @InjectView(R.id.consumer_name) TextView consumerName; 

     @InjectView(R.id.consumer_vehicle_model) TextView consumerVehicle; 

     @InjectView(R.id.text_number) TextView textNumber; 

     @InjectView(R.id.job_type_of_service) TextView typeOfService; 



     @InjectView(R.id.chat_button) ImageView chatButton; 
     public final View mView; 

     JobsViewHolder(View itemView) { 
      super(itemView); 
      mView = itemView; 
      ButterKnife.inject(this, itemView); 
     } 
    } 



} 
+0

вы держите список ваших взглядов? Если это так, вы можете получить представление из своего тега, обратившись к этому индексу в своем списке? Можете ли вы разместить какой-то код. – vguzzi

+0

в setupRecyclerView u, возможно, зарегистрировал адаптер, тогда в этом адаптере у вас может быть класс держателя, там вы можете установить прослушиватель onclick для представления и в методе onclick и получить элемент, нажатый. скажем, cv - это мой cardview cv = (CardView) itemView.findViewById (R.id.cv); cv.setOnClickListener (это); общественного недействительного OnClick (View v) {// TODO Автоматически сгенерированный метод заглушка если (v == резюме) { Toast.makeText (v.getContext(), "Имя ==>" + personName.getText (), Toast.LENGTH_SHORT) .show(); }} – Mahalakshmi

+0

@Mahalakshmi решение, которое вы указали, - это когда пользователь нажимает на вид адаптера (ов), но этот вопрос касается обновления одного из элементов адаптера recyclerview с количеством чатов без взаимодействия с пользователем. – Manikanta

ответ

0

Если вы не знаете, какой вид новые данные предназначены, чтобы быть для вас придется пересчитывать свои взгляды, установив их снова затем вызов.

notifyDataSetChanged(); 

Трудно дать вам лучший ответ, нежели это, без примера кода, чтобы узнать, как работает ваш адаптер.

EDIT:

Если вы получаете PdJob ID в вашем нажимной уведомления вы могли бы сделать что-то вроде этого:

public void updateJob(int jobId) { 
    notifyItemChanged(getPdJobPosition(jobId)); 
} 

private int getPdJobPosition(int jobId) { 
    for (int i = 0; i < jobs.size(); i++) { 
     if (jobId == jobs.get(i).getId()) { 
      return i; 
     } 
    } 
} 
+0

OMG !! это сильно повлияет на производительность приложения. Я знаю, что могу делать с notifyDataSetChanged(); но это дорогостоящий подход.Кто-нибудь с лучшим решением? – Manikanta

+0

«Трудно дать вам лучший ответ, чем это, без примера кода, чтобы узнать, как работает ваш адаптер». – vguzzi

+0

Правда, не могли бы вы разместить свой адаптер? –

Смежные вопросы