問題を解決するためのコードを示します。RecyclerView.Adapter onBindViewHolder()が間違った位置になる
私はカスタムオブジェクトからデータセットを取りタブ付きフラグメント内部recyclerviewを持っている:
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
ItemMes item = mListaItens.get((position));
holder.descricao.setText(item.getDescrição());
holder.valor.setText(MainActivity.decimalFormatWithCod.format(item.getValor()));
...
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
new MaterialDialog.Builder(mContext)
.title(holder.descricao.getText().toString())
.items(R.array.opcoes_longclick_item)
.itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
switch (which) {
case 0:
mParentFragment.showUpdateItemDialog(position);
return true;
case 1:
mParentFragment.showDeleteItemDialog(position);
return true;
}
return false;
}
})
.show();
return true;
}
});
}
:私は、アダプタのonBindViewHolder()でリスト項目のlongclick動作を設定
mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerAdapter = new MyRecyclerAdapter(mMes.getListaItens(), this, getActivity());
mRecyclerView.setAdapter(mRecyclerAdapter);
その後
、アイテム自体を削除するの世話をするフラグメントのメソッド:
public void showDeleteItemDialog(int position) {
final ItemMes item = mMes.getListaItens().get(position);
new MaterialDialog.Builder(getActivity())
.title("Confirmar Remoção")
.content("Tem certeza que deseja remover " + item.getDescrição() + "?")
.positiveText("Sim")
.negativeText("Cancelar")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
deleteItem(item);
}
})
.show();
}
public void deleteItem(ItemMes item) {
getMainActivity().deleteItemFromDatabase(item.getID());
int position = mMes.getListaItens().indexOf(item);
mMes.getListaItens().remove(position);
mRecyclerAdapter.notifyItemRemoved(position);
atualizaFragment();
}
そして、DB操作を行う活動で、最終的方法:
public int deleteItemFromDatabase(long id) {
SQLiteDatabase db = dataBaseHelper.getWritableDatabase();
String where = DBHelper.COLUNA_ID + " = ?";
String[] args = {String.valueOf(id)};
int rowsAffected = db.delete(DBHelper.TABELA_ITEM, where, args);
db.close();
return rowsAffected;
}
今私は手順を再現します: 私はリストビューで3 itensを示しています。それから私は削除しようと最初:
1 - longclickは正しいインデックスを渡し傍受された:
3 - 結局のところこれは、予想通り、アダプターは、私はこの2項目リストの最初の項目を削除しようとする場合、私は間違ってPOSIを取得し、SO 2つの項目...
を格納して表示されますションは(0である必要があり、ある1):
そして私は私が間違っている位置を取得し、この2項目リストの最後の項目を削除しようとした場合も、(1であるべきであり、2):
質問:サイズ2のデータセットがあり、アダプターがそれを知っている場合、どのようにしてをBindViewHolder(ViewHolderホルダー、int [最後のインデックス+1])と呼びますか?
何が間違っているかわかりません。だから私は助けを求めます。私はこのプロジェクトをあきらめることを考えています。なぜなら、私はすべてのことを正しくやっていますが、いつも何かが動かず、疲れました。 ありがとうございます。
アダプタコードも含める必要があります。これは、アダプタが「削除」を正しく処理していないために起こりそうです。その総数を減らす必要があります。 IDが位置である単純なリストを使用している場合は、ビューを再作成する必要がある問題が発生します。 –
完全なコードを見ることなく、確かに言うのは難しいです。 –
あなたが欲しい部分を教えて、私が投稿したら、すべてが悪くなるでしょう。たぶん私はbitbucketにいくつかのファイルのURLを貼り付けることができます... – Informatheus