带有EditText改组问题的Android RecyclerView

时间:2019-06-24 06:35:54

标签: java android android-recyclerview

我正在尝试使用EditText实现RecyclerView。首先,我要从数据库中获取成员列表,然后,对于每个成员,我想从用户输入(EditText)中获取价值。 但是,当我提交数据时,成员的值就被洗了。 我正在使用TextWatcher类,当Text Get更改时,它将在模型类中添加值。 当我滚动RecyclerView时,值会被打乱。 我尝试了所有关于堆栈溢出的解决方案,但没有一个起作用

以下是我的代码:

用于获取数据:

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;
ProgressBar progressBar;
LinearLayoutManager manager;

String URL = "members_fetch.php?club_id=98";
List<MemberListDetails> memberListDetailsList = new ArrayList<>();
private LinearLayoutManager layoutManager;
MemberListDetails memberListDetails;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progressBar = findViewById(R.id.progress);
    Button button = findViewById(R.id.button);
    recyclerView = findViewById(R.id.my_recycler_view);

    manager = new LinearLayoutManager(this);
    initRecyclerView();
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String z = ((Adapter) recyclerView.getAdapter()).getValue().toString();
            Log.wtf("aaa", z);
        }
    });
    getMembersDetails();

}

private void initRecyclerView() {
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(layoutManager);

}



private void getMembersDetails() {

    final ProgressDialog pd = new ProgressDialog(this);
    pd.setMessage("Loading Members Details");
    pd.show();
    pd.setCancelable(false);
    pd.setCanceledOnTouchOutside(false);
    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    pd.dismiss();
                    try {
                        JSONArray jsonArray = new JSONArray(response);
                        for (int i = 0; i < jsonArray.length(); i++) {

                            Log.d("ssdf", "fsdf" + response);
                            JSONObject o = jsonArray.getJSONObject(i);
                            memberListDetails = new MemberListDetails();
                            memberListDetails.setStatus(o.getString("status"));
                            memberListDetails.setMembership_id(o.getString("membership_id"));
                            memberListDetails.setFirst_name(o.getString("first_name"));
                            memberListDetails.setMiddle_name(o.getString("middle_name"));
                            memberListDetails.setLast_name(o.getString("last_name"));
                            memberListDetails.setClub_post(o.getString("club_post"));
                            memberListDetails.setDistrict_post(o.getString("district_post"));
                            memberListDetails.setGender(o.getString("gender"));
                            memberListDetails.setPost_name(o.getString("post_name"));

                          memberListDetailsList.add(memberListDetails);


                            Log.d("hhhhh", "xxxx" + memberListDetailsList);
                        }

                        recyclerView.setAdapter(new Adapter(memberListDetailsList, MainActivity.this));


                    } catch (Exception e) {
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
            Log.d("errorMsg", "dddd" + error.getMessage());

            pd.dismiss();
        }
    });
    queue.add(stringRequest);
}

}

对于适配器类:

public class Adapter extends RecyclerView.Adapter<Adapter.VHolder> {

private List<MemberListDetails> data;
Context context;
EditText text;
Integer pos;

public Adapter(List<MemberListDetails> data, Context context) {
    this.data = data;
    this.context = context;
}

@NonNull
@Override
public Adapter.VHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.item, viewGroup, false);
    return new VHolder(view);


}

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



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

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



public List<MemberListDetails> getItems() {
    return data;
}

@Override
public void onBindViewHolder(@NonNull Adapter.VHolder vHolder, int i) {
    vHolder.setIsRecyclable(false);
    vHolder.textView.setText(data.get(i).getFirst_name());
    text = vHolder.editText;
    pos = i;
    text.setText(data.get(i).getValue());

    text.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // text.setError(null);
            data.get(pos).setValue(s.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable s) {
            // text.setError(null);

            data.get(pos).setValue(s.toString());
        }
    });
}



public class VHolder extends RecyclerView.ViewHolder {
    TextView textView;
    EditText editText;

    public VHolder(View itemView) {
        super(itemView);

        textView = itemView.findViewById(R.id.tv_textView);
        editText = itemView.findViewById(R.id.editText2);

    }
}

String getValue() {
    StringBuffer x = new StringBuffer();
    for (MemberListDetails a : data) {
        x.append(a.getValue()+",");
    }
    return x.substring(0,x.length()-1);
}

}

2 个答案:

答案 0 :(得分:0)

这是解决方案。它可能包含一些错误,因为如果由于缺少诸如xml文件和Model类之类的资源而无法编译,那么它绝对可以为您服务。因为我已经在我的项目中实现了相同的功能并且工作正常

public class Adapter extends RecyclerView.Adapter<Adapter.VHolder> {

    private List<MemberListDetails> data;
    Context context;
    Integer pos;

    public Adapter(List<MemberListDetails> data, Context context) {
        this.data = data;
        this.context = context;
    }

    @NonNull
    @Override
    public Adapter.VHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.item, viewGroup, false);
        return new VHolder(view);


    }

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


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

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


    public List<String> getItems() {
        return data;
    }

    @Override
    public void onBindViewHolder(@NonNull Adapter.VHolder vHolder, int i) {
        vHolder.setIsRecyclable(false);
        vHolder.textView.setText(data.get(i).getFirst_name());
        pos = i;

        vHolder.myCustomEditTextListener.updatePosition(vHolder.getAdapterPosition());
        vHolder.editText.setText(data.get(vHolder.getAdapterPosition()));
    }


    public class VHolder extends RecyclerView.ViewHolder {
        TextView textView;
        EditText editText;
        public MyCustomEditTextListener myCustomEditTextListener;

        public VHolder(View itemView, MyCustomEditTextListener myCustomEditTextListener) {
            super(itemView);

            textView = itemView.findViewById(R.id.tv_textView);
            editText = itemView.findViewById(R.id.editText2);
            this.editText.addTextChangedListener(myCustomEditTextListener);

        }
    }

    String getValue() {
        StringBuffer x = new StringBuffer();
        for (MemberListDetails a : data) {
            x.append(a.getValue() + ",");
        }
        return x.substring(0, x.length() - 1);
    }

    private class MyCustomEditTextListener implements TextWatcher {
        private int position;

        public void updatePosition(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            // no op
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            data.set(position, charSequence.toString());
        }

        @Override
        public void afterTextChanged(Editable editable) {
            // no op
        }
    }
}

答案 1 :(得分:0)

我认为您需要删除全局编辑文本和位置。另外,在holder类中添加文本监视程序。请检查以下代码。它可能会帮助您。

public class Adapter extends RecyclerView.Adapter<Adapter.VHolder> {

private List<MemberListDetails> data;
Context context;

public Adapter(List<MemberListDetails> data, Context context) {
    this.data = data;
    this.context = context;
}

@NonNull
@Override
public Adapter.VHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.item, viewGroup, false);
    return new VHolder(view);
}

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

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

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

public List<MemberListDetails> getItems() {
    return data;
}

@Override
public void onBindViewHolder(@NonNull Adapter.VHolder vHolder, int i) {
    vHolder.setIsRecyclable(false);
    vHolder.textView.setText(data.get(i).getFirst_name());

    vHolder.editText.removeTextChangedListener(vHolder.textWatcher);
    vHolder.editText.setText(data.get(i).getValue());
    vHolder.editText.addTextChangedListener(vHolder.textWatcher);
}

public class VHolder extends RecyclerView.ViewHolder {
    TextView textView;
    EditText editText;
    TextWatcher textWatcher;

    public VHolder(View itemView) {
        super(itemView);

        textView = itemView.findViewById(R.id.tv_textView);
        editText = itemView.findViewById(R.id.editText2);

        textWatcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable s) {
            // text.setError(null);
            data.get(getAdapterPosition()).setValue(s.toString());
        }
      };
    }
}

String getValue() {
    StringBuffer x = new StringBuffer();
    for (MemberListDetails a : data) {
        x.append(a.getValue()+",");
    }
    return x.substring(0,x.length()-1);
}
相关问题