简体   繁体   English

Android RecyclerView与EditText改组问题

[英]Android RecyclerView With EditText Shuffling Problem

I Am Trying to Implement RecyclerView With EditText. 我正在尝试使用EditText实现RecyclerView。 First I Am Fetching Members List From Database And then for each member I want to get value from user input(EditText). 首先,我要从数据库中获取成员列表,然后,对于每个成员,我想从用户输入(EditText)中获取价值。 But when I submit data, values for the members are getting shuffled. 但是,当我提交数据时,成员的值就被洗了。 I Am Using TextWatcher Class, When Text Get changed it adds value in the model class. 我正在使用TextWatcher类,当Text Get更改时,它将在模型类中添加值。 Values are getting shuffled when I scroll the RecyclerView. 当我滚动RecyclerView时,值会被打乱。 I tried all the solutions on the stack overflow but none of it worked 我尝试了所有关于堆栈溢出的解决方案,但是没有一个起作用

following is my code: 以下是我的代码:

For Fetching the data: 对于获取数据:

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

} }

For Adapter Class : 对于适配器类:

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

} }

Here is the solution. 这是解决方案。 It may contain some error because I am not able to compile if due unavailable of resources like xml file and Model class But it definitely works for you. 它可能包含一些错误,因为如果由于缺少诸如xml文件和Model类之类的资源而无法编译,那么它绝对可以为您服务。 Because I have implemented the same in my project and working fine 因为我已经在我的项目中实现了相同的功能并且工作正常

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

I think you need to remove global edit text and position. 我认为您需要删除全局编辑文本和位置。 Also, add text watcher in holder class. 另外,在holder类中添加文本监视程序。 Please check below code. 请检查以下代码。 it may help you. 它可能会帮助您。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM