2015-05-28 3 views
0

У меня есть ArrayList < Строка > с 6 элементами {"1", "2", "3", "4", "5", " "6"}.Извлечение предмета из пользовательского адаптера RecycleView с использованием правильного разборки с номером заказа

Я представляю эти товары с CardView. Я хочу удалить элементы с прокруткой влево.

Это выглядит следующим образом: http://imgur.com/cuWoiB3

Когда я красть прямо из числа 2, это выглядит следующим образом: http://imgur.com/5E9fwP0

Если удалить номер 5, он удаляет номер 2. Если удалить номер 3, его удаляет номер 1. Это кажется совершенно случайным.

Я что-то упустил? Как это исправить?

Соответствующий код:

Мой адаптер:

public class ChoresAdapter extends RecyclerView.Adapter&lt;ChoresAdapter.ChoreViewHolder&gt;{ 

private ArrayList&lt;String&gt; chores; 

public ChoresAdapter(ArrayList&lt;String&gt; chores){ 
    this.chores = chores; 
} 

@Override 
public ChoreViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_cardview, parent, false); 
    v.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 
    ChoreViewHolder pvh = new ChoreViewHolder(v); 
    return pvh; 
} 


@Override 
public void onBindViewHolder(ChoreViewHolder holder, int position) { 
    holder.choreName.setText(this.chores.get(position)); 
} 

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

public void removeAt(int position) { 
    this.chores.remove(position); 
    notifyItemRemoved(position); 
    notifyDataSetChanged(); 
} 

public static class ChoreViewHolder extends RecyclerView.ViewHolder { 
    CardView cv; 
    public static TextView choreName; 
    public static TextView personAge; 
    public static ImageView personPhoto; 

    ChoreViewHolder(View itemView) { 
     super(itemView); 
     cv = (CardView)itemView.findViewById(R.id.cv); 
     choreName = (TextView)itemView.findViewById(R.id.chore_name); 
    } 
    } 

    } 

Соответствующий код в моем фрагменте:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_chores, container, false); 
    RecyclerView rv = (RecyclerView)view.findViewById(R.id.rv); 
    rv.setHasFixedSize(true); 

    LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
    rv.setLayoutManager(llm); 
    chores = new ArrayList&lt;&gt;(); 
    chores.add("1"); 
    chores.add("2"); 
    chores.add("3"); 
    chores.add("4"); 
    chores.add("5"); 
    chores.add("6"); 
    adapter = new ChoresAdapter(chores); 
    SwipeableRecyclerViewTouchListener swipeTouchListener = 
      new SwipeableRecyclerViewTouchListener(rv, 
        new SwipeableRecyclerViewTouchListener.SwipeListener() { 
         @Override 
         public boolean canSwipe(int position) { 
          return true; 
         } 

         @Override 
         public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) { 
          for (int position : reverseSortedPositions) { 
           adapter.removeAt(position); 
          } 
         } 

         @Override 
         public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) { 
          for (int position : reverseSortedPositions) { 
           adapter.removeAt(position); 
          } 
         } 
        }); 

    rv.addOnItemTouchListener(swipeTouchListener); 
    rv.setAdapter(adapter); 
    return view; 
} 

ответ

1

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

chores.remove(position); 
adapter.notifyDataSetChanged(); 

Вам не нужно делать это на классе адаптера.

0

Вы можете использовать нижеследующий код (ItemTouchHelper.SimpleCallback из Android поддержки V7), чтобы удалить карты из RecyclerView с помощью жестов. Вам нужно удалить элемент из ArrayList, когда вы проведете его из RecyclerView.

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { 

    @Override 
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
     return false; 
    } 

    @Override 
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
     chores.remove(viewHolder.getAdapterPosition()); 
     adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); 
    } 

    @Override 
    public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) { 
     super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y); 
    } 
}; 

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
itemTouchHelper.attachToRecyclerView(recList); 
Смежные вопросы