2016-06-23 3 views
3

Я сделал список карточек внутри recyclerView. Когда карта удерживается на какое-то время, ее соответствующая запись в базе данных удаляется, после чего карта должна быть удалена. Это можно сделать, вызвав настройку нового обновленного адаптера. Но я не могу использовать функцию setAdapter внутри onBindViewHolder, потому что я не знаю, как получить такой же recyclerView. Пожалуйста помоги.Как обновить recyclerView внутри onBindViewHolder своего адаптера?

КОД:

public class RecyclerViewAdapterMain extends RecyclerView.Adapter<RecyclerViewAdapterMain.ViewHolder> { 

String[] strings; 
DBManager dbManager; 

public RecyclerViewAdapterMain(String[] arrayList) { 
    this.strings = arrayList; 
} 

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

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    holder.textView.setText(strings[position]); 
    holder.cardView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(holder.itemView.getContext(),SecondActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("list",strings[position]); 
      intent.putExtras(bundle); 
      holder.itemView.getContext().startActivity(intent); 
      //overridePendingTransition(R.anim.abc_fade_in,R.anim.abc_fade_out); 
     } 
    }); 
    holder.cardView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(final View view) { 
      DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        switch (which){ 
         case DialogInterface.BUTTON_POSITIVE: 
          dbManager = new DBManager(holder.itemView.getContext(),null,null,1); 
          dbManager.deleteList(strings[position]); 
          String[] strings = dbManager.showLists(); 
          RecyclerViewAdapterMain recyclerViewAdapter = new RecyclerViewAdapterMain(strings); 
          //I WANT TO SET UPDATED ADAPTER HERE 
          break; 

         case DialogInterface.BUTTON_NEGATIVE: 
          //No button clicked 
          break; 
        } 
       } 
      }; 
      AlertDialog.Builder builder = new AlertDialog.Builder(holder.itemView.getContext()); 
      builder.setMessage("Are you sure that you want to delete \""+strings[position]+"\"?").setPositiveButton("Yes", dialogClickListener) 
        .setNegativeButton("No", dialogClickListener).show(); 
      return true; 
     } 
    }); 


} 

@Override 
public int getItemCount() { 
    return strings.length; 
} 

public class ViewHolder extends RecyclerView.ViewHolder{ 
    CardView cardView; 
    TextView textView; 
    public ViewHolder(View itemView) { 
     super(itemView); 
     textView = (TextView) itemView.findViewById(R.id.textView); 
     cardView = (CardView) itemView.findViewById(R.id.cardView); 
    } 
} 

}

ответ

1

Вам необходимо обновить существующую переменную

String[] strings; 

Затем скажите RecyclerView, чтобы перерисовать элементы.

notifyItemRemoved(position); 

или

notifyDataSetChanged(); 

Затем вы получите

case DialogInterface.BUTTON_POSITIVE: 
         dbManager = new DBManager(holder.itemView.getContext(),null,null,1); 
         dbManager.deleteList(strings[position]); 
         strings = dbManager.showLists(); 
         notifyItemRemoved(position); 
         break; 
+1

Спасибо человеку. Это сработало! На самом деле внутри onBind я снова использовал String [] strings = dbManager.showLists(); внутри написания просто строки = dbManager.showLists(); обновляет его. :) –

0

Попробуйте

RecyclerViewAdapterMain.this.notifyItemRemoved(position);

+0

Nope.It не работает. :/ –

+0

Я даже использовал RecyclerViewAdapterMain.this.notifyDataSetChanged(); но это тоже не сработало. –

+0

См. Комментарий к другому ответу. –

4

Запись в классе адаптера в onBindViewHolder

photolist.remove(i); 
notifyItemRemoved(i); 
notifyItemRangeChanged(i, photolist.size()); 
notifyDataSetChanged();