RecyclerView Adapter中的索引编制问题.如何以一种好的方式做到这一点? [英] Problem with indexing in RecyclerView Adapter. How to do it in a good way?

查看:60
本文介绍了RecyclerView Adapter中的索引编制问题.如何以一种好的方式做到这一点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对RecyclerView适配器有一些问题.我想做一个ID索引为1,2,3 ...的列表.当一个项目被删除时,它应该将每个下一个项目的位置设置为position-1.像这样:(例如删除数字3) 1 | 2 | 3 | 4 | 5-> 1 | 2 | 3 | 4

I have some problems with RecyclerView Adapter. I want to do the list with id index: 1,2,3... When an item is removed it should set every next item position to position-1. Like this: (for example delete number 3) 1|2|3|4|5 -> 1|2|3|4

在以下情况下,它可以完美发挥作用:

It works perfectly when:

 @Override
public long getItemId(int position) {
    return position;
}
@Override
public int getItemViewType(int position) {
    return position;
}

但这会导致notifyItemRemoved()的其他错误. 当我设置时:

But this causes other errors with notifyItemRemoved(). When I set:

@Override
public long getItemId(int position) {
    return 0;
}
@Override
public int getItemViewType(int position) {
    return 0;
}

滚动后的项目顺序,数字的可重复性等都有问题.

It has problems with item order after scrolling, with repeatability of numbers etc.

我被困住了.

MainActivity.class

MainActivity.class

public class MainActivity extends AppCompatActivity {
    private DatabaseHelper databaseHelper;
    private EditText editText;
    private Button showButton,saveButton;
    private RecyclerView mainListRecyclerView;
    private ArrayList<String>arrayList;
    private MainListAdapter mainListAdapter;
    private RecyclerView.LayoutManager layoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       editText = (EditText) findViewById(R.id.editText);
       showButton = (Button) findViewById(R.id.showButton);
       saveButton = (Button) findViewById(R.id.saveButton);
       mainListRecyclerView = (RecyclerView) findViewById(R.id.listView);
       databaseHelper = new DatabaseHelper(this);
    arrayList = new ArrayList<>(20);
    layoutManager = new LinearLayoutManager(this);
    mainListRecyclerView.setLayoutManager(layoutManager);

    mainListAdapter = new MainListAdapter(arrayList,this);
    mainListAdapter.setHasStableIds(false);
    mainListRecyclerView.setAdapter(mainListAdapter);
    mainListAdapter.notifyDataSetChanged();

    showButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, FinalListActivity.class);
            intent.putExtra("productList",arrayList);
            MainActivity.this.startActivity(intent);
        }
    });
    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId==EditorInfo.IME_ACTION_DONE) {
                addItem();
            }
            return true;
        }
    });
}
public void addData(String newItem){
    boolean insertData = databaseHelper.addData(newItem);
    if(insertData){
        toastMessage("Item successfully inserted!");
    }
    else {
        toastMessage("Something is wrong");
    }
}
public void removeData(String itemToRemove){
    boolean removeData = databaseHelper.removeData(itemToRemove);
    if(removeData){
        toastMessage("Item successfully deleted!");
    }
    else {
        toastMessage("Something is wrong");
    }
}
public void toastMessage(String message){
    Toast.makeText(this,message,Toast.LENGTH_SHORT).show();

}
public void addItem(){
    String newItem = editText.getText().toString();
    if(newItem.length()!=0) {
        addData(newItem);
        arrayList.add(newItem);
        editText.setText("");
        editText.requestFocus();
        mainListAdapter.notifyItemInserted(arrayList.size()-1);

    }
    else{
        toastMessage("You must put something in the text field");
    }
}
public void removeItem(int position){
    if(mainListAdapter.getItemCount()!=0){
        removeData(arrayList.get(position));
        arrayList.remove(position);
        mainListAdapter.notifyItemRemoved(position);
    }
}

}

适配器类

public class MainListAdapter extends 
RecyclerView.Adapter<MainListAdapter.MyViewHolder> {
    private ArrayList<String> mDataset;
    private MainActivity mainActivity;
public MainListAdapter(ArrayList<String> mDataset, MainActivity 
mainActivity) {
    this.mDataset = mDataset;
    this.mainActivity = mainActivity;
}
@Override
public long getItemId(int position) {
    return 0;
}
@Override
public int getItemViewType(int position) {
    return 0;
}
@Override
public int getItemCount() {
    return mDataset.size();
}
@Override
public void onBindViewHolder(final MyViewHolder holder,final int position) {
    holder.listTextView1.setText(holder.getAdapterPosition()+"");
    holder.listTextView2.setText(mDataset.get(position));
    holder.listButtonViewDel.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            int currentPosition = holder.getAdapterPosition();
            if(currentPosition!=-1)
            mainActivity.removeItem(currentPosition);
        }
    });
}
public class MyViewHolder extends RecyclerView.ViewHolder {
    final public TextView listTextView1;
    final public TextView listTextView2;
    final public Button listButtonViewDel;

    public MyViewHolder(View view) {
        super(view);
        listTextView1 = (TextView) view.findViewById(R.id.listTextView1);
        listTextView2 = (TextView) view.findViewById(R.id.listTextView2);
        listButtonViewDel = (Button) view.findViewById(R.id.listButtonViewDel);
    }
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_list_layout, parent, false);
    return new MyViewHolder(view);
}

}

推荐答案

将此行添加到MainActivity.java中的removeItem函数

Add this lines To removeItem function in MainActivity.java

public void removeItem(int position){
        if(mainListAdapter.getItemCount()!=0){
            removeData(arrayList.get(position));
            arrayList.remove(position);
            mainListAdapter.notifyItemRemoved(position);
            arrayList.remove(position); // add this line
            mainListAdapter.update(arrayList); // add this line
        }
    }

像这样向您的MainListAdapter.java添加更新功能

And add update function to your MainListAdapter.java like this

public void update(ArrayList<String> mDataset){
     this.mDataset = mDataset
     notifyDataSetChanged();
}

对于显示动画,请尝试使用此功能(建议您在适配器中设置有关适配器的所有功能)

For show animation try this function (I suggest you to set all function about adapter in adapter)

public void update(ArrayList<String> mDataset,int position){
         this.mDataset = mDataset
         notifyItemRangeChanged(position,mDataset.size);
}

这篇关于RecyclerView Adapter中的索引编制问题.如何以一种好的方式做到这一点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆