2017-02-15 3 views
0

У меня есть RecyclerView, определенный в моем проекте андроида. Adapter для RecyclerView заключается в следующемОбновите просмотр текста recycler?

public class CustomAdapter1 extends RecyclerView.Adapter<CustomAdapter1.MyViewHolder> { 
    private Fragment1 myFrag; 
    private ArrayList<DataModel1> dataSet; 
    DBHandler db; 
    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView butAccept,butReject; 
    TextView nick,stat,tit,cat,desc,dt; 
    public CardView cardView; 
    public MyViewHolder(View itemView) { 
     super(itemView); 
     this.nick = (TextView) itemView.findViewById(R.id.nick); 
     this.stat = (TextView) itemView.findViewById(R.id.stat); 
     this.tit = (TextView) itemView.findViewById(R.id.tit); 
     this.cat = (TextView) itemView.findViewById(R.id.cat); 
     this.desc = (TextView) itemView.findViewById(R.id.desc); 
     this.dt = (TextView) itemView.findViewById(R.id.dt); 
     this.butAccept = (TextView)itemView.findViewById(R.id.accept_textview); 
     cardView = (CardView) itemView.findViewById(R.id.card_view); 
     cardView.setOnClickListener(this); 
     butAccept.setOnClickListener(this); 
     db = new DBHandler(itemView.getContext()); 
    } 

    @Override 
    public void onClick(View v) { 
     if(v.getId() == butAccept.getId()){ 
      String x = String.valueOf(dataSet.get(getAdapterPosition()).getMeetId()); 

      myFrag.showToast(x); 
     } 

    } 

} 

public CustomAdapter1(ArrayList<DataModel1> data,Fragment1 frag) { 
    this.dataSet = data; 
    myFrag = frag; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardfrag1, parent, false); 
    MyViewHolder myViewHolder = new MyViewHolder(view); 
    return myViewHolder; 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder,final int listPosition) { 
    TextView nick = holder.nick; 
    TextView stat = holder.stat; 
    TextView tit = holder.tit; 
    TextView cat = holder.cat; 
    TextView desc = holder.desc; 
    TextView dt= holder.dt; 
    nick.setText(dataSet.get(listPosition).getNick()); 
    stat.setText(dataSet.get(listPosition).getStat()); 
    tit.setText(dataSet.get(listPosition).getTit()); 
    cat.setText(dataSet.get(listPosition).getCat()); 
    desc.setText(dataSet.get(listPosition).getDesc()); 
    dt.setText(dataSet.get(listPosition).getDt()); 
} 


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

Окончательный TextViewbutAccept имеет динамический values.I имеют внутреннюю БД, который имеет столбец Status. Когда значение Status равно 1, мне нужно изменить текст, который отображается в поле TextView butAccept.

Как мне это сделать? Должен ли я писать функцию в моем CustomAdapter или в фрагменте, в котором я использую адаптер?

В моем фрагменте У меня есть функция:

private void checkTheAcceptStatus(int x){ 
     int status = db.getMeetingStatus(x); 
     Toast.makeText(getActivity(),String.valueOf(status),Toast.LENGTH_SHORT).show(); 
     if(status == 1){ 

     } 

    } 

Эта функция который вызывается каждый раз, когда новый элемент добавляется к адаптеру. Внутренняя БД запрашивается правильно, и если возвращается значение Status. Если значение равно 1, что мне делать?

I saw this question,, но это неясно, и я не смог прийти к какому-либо выводу из этого.

+0

где 'ArrayList dataSet'? из вашей базы данных sqlite тоже? – pskink

+0

Нет. Это из онлайн-БД. – Tyson

+0

«DataModel1» - это схема данных, которые я получаю из онлайн-базы данных, а «MeetingList» - это схема данных, которые используются SQLite. – Tyson

ответ

0

Если я правильно понял, каждая строка в вашем списке имеет эту кнопку принятия. Поэтому в вашем onBindViewHolder() вы не можете установить текст кнопок в зависимости от состояния вашей переменной статуса. Когда вы обнаруживаете изменения в своем db, вы можете использовать различные методы уведомления, предоставляемые в зависимости от ваших потребностей: notifyItemChanged (...), notifyItemRangeChanged (...), notifyItemAdded (...), notifyItemRemoved (...) и т. Д. Ваш onBindViewHolder должен выглядеть примерно так:

@Override 
public void onBindViewHolder(final ViewHolder vh, int position) { 
    if(dataSet.get(position).getStatus() == 1){ 
     vh.butAccept.setText("Your status 1 case text here"); 
    } else { 
     vh.butAccept.setText("Your status not 1 case text here"); 
    } 
} 

Также вы можете просто использовать notifyDataSetChanged(), если вы хотите, чтобы обновить весь список, но методы выше являются более эффективными.

+0

Должен ли я периодически звонить этим методам или они будут срабатывать при изменении? – Tyson

+0

Вы должны позвонить им, когда узнаете, что ваши данные изменились. Если вы хотите периодически обновлять свой список, вам необходимо реализовать логику, которая проверяет вашу базу данных или где вы получаете свои данные от себя. Когда вы обнаружите, что ваши данные изменились, используйте методы уведомления, и адаптер вызовет onBindViewHolder (...) для строк, которые необходимо обновить. –

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