RecyclerView Adapter中的索引编制问题。如何以一种好的方式做到这一点?

时间:2018-12-23 14:09:48

标签: android indexing android-recyclerview android-styles

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

它在以下情况下可以完美工作:

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

但这会导致notifyItemRemoved()出现其他错误。 当我设置时:

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

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

我被困住了。

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);
}

}

Image which can help understand it

3 个答案:

答案 0 :(得分:0)

在您的removeItem()方法中,
您有mainListAdapter.notifyItemRemoved(position);,它只会通知该项目已删除。
您需要在此方法的末尾加上一行mainListAdapter.notifyDataSetChanged()
它提醒适配器在每次更改时重置列表。

答案 1 :(得分:0)

添加以下行以删除MainActivity.java中的removeItem函数

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中

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

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

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

答案 2 :(得分:0)

您可以将mainListRecyclerVie wadapter设置为null并在删除项目时再次绑定!

  

mainListRecyclerVie.setAdapter(null);

然后重新绑定