在自定义的TextWatcher中更新Adapter/RecyclerView

3

我正在尝试在自定义的文本监视器中添加/删除一个RecyclerView项。

以下是我的自定义文本监视器的一部分:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    //get the position and size from edit text
    int position = (int) editText.getTag(R.string.position);
    int size = (int) editText.getTag(R.string.listSize);

    //if the character count equals 1
    if (count == 1){
        //check if the current position is proven to be the last item in the list
        if (position + 1 == size){
            //add an item to the list here

        }
    } 
}

当它说“在此处将项目添加到适配器列表”时,我想要向我的recyclerview添加一个项目并更新适配器。

我相信没有简单的方法可以做到这一点。我需要使用Singleton设计模式来设置这个吗?还是我可以在我的MainActivity上创建一个自定义侦听器,在我想要添加项目时调用它?

我还使用了一个自定义适配器,如果有人需要,我可以发布它。

**使用我的自定义适配器进行更新

public class PlayerAdapter extends RecyclerView.Adapter<PlayerAdapter.PlayerHolder>{

    private List<Players> playerList;

    public PlayerAdapter(List<Players> list) {
        playerList = list;
    }

    /* ViewHolder for each item */
    public class PlayerHolder extends RecyclerView.ViewHolder  {

        EditText playerName;

        PlayerHolder(View itemView) {
            super(itemView);
            Log.e("Holder","setview");
            playerName = itemView.findViewById(R.id.name);
            MyTextWatcher textWatcher = new MyTextWatcher(playerName);
            playerName.addTextChangedListener(textWatcher);
        }
    }

    @Override
    public PlayerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.new_player_item_layout, parent, false);
        return new PlayerHolder(itemView);
    }

    @Override
    public void onBindViewHolder(PlayerHolder holder, int position) {
        Players playerItem = playerList.get(position);

        //Sets Text
        //holder.playerName.setText(playerItem.getName());
        holder.playerName.setTag(R.string.listSize, playerList.size());
        holder.playerName.setTag(R.string.position, position);
    }

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

    public void updateList(List<Players> newList){
        playerList = newList;
        notifyDataSetChanged();
    }
}

你的 customTextWatcher 和 CustomAdapter 是在同一个类中实例化的吗?比如 Activity 类? - Jojo Narte
适配器在MainActivity中被实例化,自定义的TextWatcher在我的适配器中被实例化。适配器有一个继承RecyclerView.ViewHolder的视图持有者,在我的PlayerHolder(View itemView)中我实例化了我的TextWatcher。我将在上面添加我的适配器。 - C. Skjerdal
现在是这样的。 - C. Skjerdal
1个回答

2

编辑:添加而不是更新 您需要的是一个接口来连接TextWatcher和RecyclerView的逻辑。 例如,您可以拥有此接口,但可以根据需要进行修改。

interface AddPlayerInterface {
    private void addPlayer(Player player);
}

你可以在你的适配器中实现它,例如:
    class Adapter extends RecyclerView.Adapter implements AddPlayerInterface {
        // ... your other adapter implementation codes

        @override
        private void addPlayer(Player player) {
            // here you can add the new player to the list
            list.add(player);
            notifyDataSetChanged(); // or any of the helper methods to notify adapter of change like for specific rows
        }

    }

然后您通过以下方式将您的监听器引用传递给TextWatcher:

@Override
public PlayerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.new_player_item_layout, parent, false);


    return new PlayerHolder(itemView, listener);
}

您的TextWatcher将包含调用接口的引用。

class CustomWatcher implements TextWatcher { protected Player player; private AddPlayerInterface listener; }

   private CustomWatcher(Player player, AddPlayerInterface interface)
   {
       this.player = player;
       this.listener = interface;
   }

   @Override
   public void afterTextChanged(Editable editable)
   {
        // if you want it on after textchanged you'd call it here and you would probably create the new player instance here
       Player player = new Player();
       listener.addPlayer(player); // this would call the listener implementation on your adapter 

   }
}

那实际上可能会简化我的一些代码,但也许我没有解释清楚。我想在我的RecyclerView中添加另一个项目。类似于... Players player = new Players(“”); list.add(player); myAdapter.notifyDataSetChanged(); - C. Skjerdal
对不起,是我让你感到困惑了。 - C. Skjerdal
只需要一个,但我希望用户可以尽可能地向上移动。我现在已经发布了我的适配器。 - C. Skjerdal
1
我已经修改了我的答案。 - Jojo Narte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接