2016-05-23 13 views
-1

Ich benutze Android-Annotationen und erstellt Recycler List, das Problem ist, wenn ich etwas in Halter löschen und Adapter mithilfe von Listener mit notifyItemRemoved(position); aktualisieren. Die Position im Halter wird nicht aktualisiert.How to getAdapterPosition in RecyclerView ViewHolder mit Android-Anmerkungen

@EBean 
    public static class CheckListAdapter extends RecyclerViewAdapterBase<LinkedHashMap<String, String>, HolderItemView> 
      implements AdapterListener { 

     private final Context mContext; 

     public CheckListAdapter(Context context) { 
      mContext = context; 
      this.items = new ArrayList<>(); 
     } 

     @Override 
     protected HolderItemView onCreateItemView(ViewGroup parent, int viewType) { 
      return CheckListFragment_.HolderItemView_.build(mContext); 
     } 

     public void updateAdapter(ArrayList<LinkedHashMap<String, String>> list) { 
      items.clear(); 
      items.addAll(list); 
      notifyDataSetChanged(); 
     } 

     public void addData(LinkedHashMap<String, String> map) { 
      items.add(map); 
      notifyItemChanged(items.size() - 1); 
     } 

     @Override 
     public void onBindViewHolder(ViewWrapper<HolderItemView> holder, int position) { 
      HolderItemView view = holder.getView(); 
      view.bind(items, position, this); 
     } 

     @Override 
     public void itemRemoved(int position) { 
      notifyItemRemoved(position); 
     } 
    } 

HolderItemView.java

@EViewGroup(R.layout.item_checklist) 
    public static class HolderItemView extends LinearLayout { 
     private Context mContext; 
     @ViewById 
     AppCompatCheckBox checkbox; 
     @ViewById 
     TextView checklist_tv; 
     @ViewById 
     EditText checklist_et; 
     @ViewById 
     ImageView deleteButton; 
     private AdapterListener mListener; 
     private List<LinkedHashMap<String, String>> mainMap; 
     private int position; 

     public HolderItemView(Context context) { 
      super(context); 
      mContext = context; 
     } 

     public void bind(List<LinkedHashMap<String, String>> mainMap, int position, AdapterListener mListener) { 
      this.mainMap = mainMap; 
      this.position = position; 
      this.mListener = mListener; 
      if (mainMap.get(position).get("title").isEmpty()) { 
       checklist_tv.setVisibility(View.GONE); 
       checklist_et.setVisibility(View.VISIBLE); 
       checklist_tv.setText(""); 
       checklist_et.setText(""); 
      } else { 
       checklist_tv.setText(mainMap.get(position).get("title")); 
      } 
      checklist_et.setOnEditorActionListener(editListener); 
      checkbox.setOnCheckedChangeListener(checkChangeListener); 

     } 

     @Click 
     public void checklist_tv() { 
      checklist_et.setText(checklist_tv.getText()); 
      checklist_tv.setVisibility(View.GONE); 
      checklist_et.setVisibility(View.VISIBLE); 
     } 

     @Click 
     public void deleteButton() { 
      mainMap.remove(position); 
      mListener.itemRemoved(position); 
     } 

     private TextView.OnEditorActionListener editListener = new TextView.OnEditorActionListener() { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
       if (actionId == EditorInfo.IME_ACTION_DONE) { 
        checklist_et.setVisibility(View.GONE); 
        checklist_tv.setVisibility(View.VISIBLE); 
        checklist_tv.setText(checklist_et.getText()); 
        InputMethodManager in = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); 
        in.hideSoftInputFromWindow(checklist_et.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
       } 
       return false; 
      } 
     }; 
     private CompoundButton.OnCheckedChangeListener checkChangeListener = new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        checklist_tv.setPaintFlags(checklist_tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
       } else { 
        checklist_tv.setPaintFlags(checklist_tv.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); 
       } 
      } 
     }; 
    } 

    public interface AdapterListener { 
     void itemRemoved(int position); 
    } 

RecyclerViewAdapterBase.java

import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.view.ViewGroup; 

import java.util.List; 

public abstract class RecyclerViewAdapterBase<T, V extends View> extends RecyclerView.Adapter<ViewWrapper<V>> { 

    protected List<T> items; 

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

    @Override 
    public final ViewWrapper<V> onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ViewWrapper<>(onCreateItemView(parent, viewType)); 
    } 

    protected abstract V onCreateItemView(ViewGroup parent, int viewType); 

    // additional methods to manipulate the items 
} 

ViewWrapper.java

import android.support.v7.widget.RecyclerView; 
import android.view.View; 

public class ViewWrapper<V extends View> extends RecyclerView.ViewHolder { 

    private V view; 

    public ViewWrapper(V itemView) { 
     super(itemView); 
     view = itemView; 
    } 

    public V getView() { 
     return view; 
    } 
} 
+1

posten Sie Ihre Code tun, was Sie – Gaurav

+0

habe ich versucht, den Code aktualisiert haben, schauen Sie bitte @Gaurav –

Antwort

2

Nachdem Sie einen Artikel entfernen Recycler Ansicht, die Sie Artikel benachrichtigen müssen Bereichsänderung. Sie müssen also so etwas wie dieses

notifyItemRemoved(position);. 
notifyItemRangeChanged(position, arrayList.size()); 
+0

Ist das nicht seltsam aussehen mit den Standard RecyclerView Animationen? – Jeffalee