当前位置: 首页 > 知识库问答 >
问题:

如何防止项目在滚动或键盘上以动态形式重复?

桂志新
2023-03-14

大家好,我已经创建了该地区的调查项目。我已经在recycler视图中加载了这个问题,其中edittext、radiobutton、checkbox、spinner是动态生成的(每个都没有单独的布局文件)。我使用了新的edittext和textwatcher在列表中动态更新答案,以便它可以返回到mainactivity,即从adapterclass到activity class。我的问题是edittext、单选按钮等被复制,但不是文本视图中向上或向下滚动或键盘向下滚动时的问题,如果操作员执行了诸如在edittext内输入或在微调器中更改值的操作,然后向上滚动

注意:-文本视图是静态组件,动态输入被添加到行布局文件中的线性布局中,即文本视图和编辑文本都是线性布局的子组件,基于如果输入类型被添加为线性布局的第二个子

活动班

 mlist=new ArrayList<>();
    mlist.clear();
    mlist=db.populatequestion();
    Log.d("size", String.valueOf(mlist.size()));
    Log.d("Question",mlist.get(0).getQuestionType());
    mRecyclerView=findViewById(R.id.rvForm);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    formsadapter =new formsadapter(mlist,this,mRecyclerView);
    mRecyclerView.setAdapter(formsadapter);

formsadapter.class

public class formsadapter extends RecyclerView.Adapter<formsadapter.ViewHolder> {
private List<FormQData> mlists;
private List<formanswer> formanswers;
private Context mContext1;
private RecyclerView mRecyclerV1;
public class ViewHolder extends RecyclerView.ViewHolder{
    public LinearLayout linearLayout;
    public TextView Question;
    public View layout;
    public ViewHolder(View v) {
        super(v);
        layout=v;
        Question=v.findViewById(R.id.tvQuestion);
        linearLayout=v.findViewById(R.id.llform);
        formanswers = new ArrayList<>();
    }
}

public formsadapter(List<FormQData> myDataset, Context context, RecyclerView recyclerView) {
    mlists = myDataset;
    mContext1 = context;
    mRecyclerV1 = recyclerView;
}
public formsadapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                  int viewType){
    LayoutInflater inflater = LayoutInflater.from(
            parent.getContext());
    View v =inflater.inflate(R.layout.row_form, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}
public void onBindViewHolder(formsadapter.ViewHolder holder, final int position){
    final FormQData fb=mlists.get(position);
    formanswer fa=new formanswer();
    holder.Question.setText(fb.getQuestionContent());
    LinearLayout.LayoutParams mainparams1 = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
    mainparams1.gravity= Gravity.RIGHT;
    if(fb.getQuestionType().equals("textbox")){
        EditText et=new EditText(mContext1);
        et.setBackgroundResource(R.drawable.boxwithcircularcoloredborders);
        et.setTextColor(mContext1.getResources().getColor(R.color.colorPrimary));
        et.setPadding(15,15,15,15);
        et.addTextChangedListener(new TextWatcher() {
            @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            @Override
            public void afterTextChanged(Editable editable) {
                fa.setQuestionid(fb.getQuestionid());
                fa.setAnswer(et.getText().toString());
                if(formanswers.contains(fa)){
                    formanswers.set(formanswers.indexOf(fa),fa);
                }
                else
                    formanswers.add(fa);
            }
        });
        holder.linearLayout.addView(et,1);
    }
    else if(fb.getQuestionType().equals("radiobox")){
        RadioGroup rg=new RadioGroup(mContext1);
        rg.setOrientation(RadioGroup.HORIZONTAL);
        String[] arrOfStr = fb.getQuestionOptions().split(":");
        RadioButton[] radiobutton = new RadioButton[arrOfStr.length];
        for(int i=0;i<arrOfStr.length;i++){
            radiobutton[i]=new RadioButton(mContext1);
            radiobutton[i].setText(arrOfStr[i]);
            radiobutton[i].setLayoutParams(mainparams1);
            radiobutton[i].setBackgroundResource(R.drawable.boxwithcircularcoloredborders);
            radiobutton[i].setTextColor(mContext1.getResources().getColor(R.color.colorPrimary));
            radiobutton[i].setTypeface(Typeface.DEFAULT_BOLD);
            radiobutton[i].setPadding(15,15,15,15);
            int finalI = i;
            radiobutton[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    fa.setQuestionid(fb.getQuestionid());
                    fa.setAnswer(radiobutton[finalI].getText().toString());
                    if(formanswers.contains(fa)){
                        formanswers.set(formanswers.indexOf(fa),fa);
                    }
                    else
                        formanswers.add(fa);
                }
            });
            rg.addView(radiobutton[i],i);
        }
        holder.linearLayout.addView(rg,1);
    }
    else if(fb.getQuestionType().equals("checkbox")){
        List<String> answer=new ArrayList<>();
        RadioGroup rg=new RadioGroup(mContext1);
        rg.setOrientation(RadioGroup.HORIZONTAL);
        String[] arrOfStr = fb.getQuestionOptions().split(":");
        CheckBox[] checkBoxes = new CheckBox[arrOfStr.length];
        for(int i=0;i<arrOfStr.length;i++){
            checkBoxes[i]=new CheckBox(mContext1);
            checkBoxes[i].setText(arrOfStr[i]);
            checkBoxes[i].setLayoutParams(mainparams1);
            checkBoxes[i].setBackgroundResource(R.drawable.boxwithcircularcoloredborders);
            checkBoxes[i].setTextColor(mContext1.getResources().getColor(R.color.colorPrimary));
            checkBoxes[i].setTypeface(Typeface.DEFAULT_BOLD);
            checkBoxes[i].setPadding(15,15,15,15);
            int finalI = i;
            checkBoxes[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    fa.setQuestionid(fb.getQuestionid());
                    if(checkBoxes[finalI].isChecked()){
                        String temp=checkBoxes[finalI].getText().toString();
                        if(answer.contains(temp)){
                            answer.set(answer.indexOf(temp),temp);
                        }else {
                            answer.add(checkBoxes[finalI].getText().toString());
                        }
                    }else{
                        answer.remove(checkBoxes[finalI].getText().toString());
                    }
                    fa.setAnswer(answer.toString());
                    if(formanswers.contains(fa)){
                        formanswers.set(formanswers.indexOf(fa),fa);
                    }
                    else
                        formanswers.add(fa);
                }
            });
            rg.addView(checkBoxes[i],i);
        }
        holder.linearLayout.addView(rg,1);
    }
    else if(fb.getQuestionType().equals("dropdown")){
        Spinner spinner=new Spinner(mContext1);
        fa.setQuestionid(fb.getQuestionid());
        List<String> arrOfStr=new ArrayList<>(Arrays.asList(fb.getQuestionOptions().split(":")));
        arrOfStr.add(0,"Select A Option");
        ArrayAdapter<String> spinnerAdapter=new ArrayAdapter<>(mContext1,R.layout.row_dropdownsinglecelltv,R.id.tvsinglecell2,arrOfStr);
        spinnerAdapter.setDropDownViewResource(R.layout.row_dropdownsinglecelltv);
        spinner.setPopupBackgroundDrawable(mContext1.getResources().getDrawable(R.drawable.boxcircularcorner));
        spinner.setAdapter(spinnerAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String spinnerValue=String.valueOf(adapterView.getSelectedItem());
                if (!spinnerValue.equals("Select A Option")){
                    //Log.d("value","upload");
                    fa.setAnswer(spinnerValue);
                    if(formanswers.contains(fa))
                        formanswers.set(formanswers.indexOf(fa),fa);
                    else
                        formanswers.add(fa);
                }else{
                    if(formanswers.contains(fa))
                        formanswers.remove(fa);
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
        holder.linearLayout.addView(spinner,1);
    }
    else {
        TextView et=new TextView(mContext1);
        et.setText("invalid question type");
        holder.linearLayout.addView(et,1);
    }
}
public int getItemCount(){
    return  mlists.size();
}
@Override
public long getItemId(int position) {
    return position;
}
@Override
public int getItemViewType(int position) {
    return position;
}
public List<formanswer> formanswers(){
    return formanswers;
}

}

排成一排。xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:padding="10dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">
<LinearLayout
    android:id="@+id/llform"
    android:background="@drawable/boxwithcoloredborder"
    android:layout_width="match_parent"
    android:padding="15dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">



    <TextView
        android:id="@+id/tvQuestion"
        android:padding="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/colorPrimary"
        android:textStyle="bold"
        android:text="TextView" />

</LinearLayout>
</LinearLayout>

这是视频样本

https://imgur.com/a/hi3Vb5a

共有1个答案

段晨
2023-03-14

我找到了解决办法,但问题似乎完全不同。问题是,recycler视图没有被正确回收,它的viewCachesize需要增加到列表大小

你可以检查你的recyclerview是否被回收或没有使用

@Override
    public void onViewRecycled(@NonNull formsadapter.ViewHolder holder) {
   Log.d("recyclerview","recyclerview is recycled");
    }

如果日志正在出现,则可以解决此问题,并添加

holder.setIsRecyclable(false);

在onbindviewholder中或添加

mRecyclerView.setItemViewCacheSize(mlist.size()+1);

在主活动本身中,显然只需使用listview本身而不是recyclerview,那么就不需要添加这些行了

链接:-如果视图计数很小,则RecyclerView不循环视图

如何从recyclerView适配器中检测回收,以便在回收之前执行操作?

 类似资料:
  • 问题内容: 我有一个输入活动。初始化活动后,将显示Android键盘。在用户集中输入之前,键盘如何保持隐藏状态? 问题答案: 我认为以下可能有效 我以前已经将它用于此类事情。

  • 问题内容: 我有一个中心对齐的DIV网站。现在,有些页面需要滚动,有些不需要。当我从一种类型移动到另一种类型时,滚动条的外观会将页面向侧面移动几个像素。如果没有在每个页面上明确显示滚动条,有什么办法可以避免这种情况? 问题答案: overflow-y:scroll是正确的,但是您应该将其与html标记一起使用,而不是body,否则在IE 7中 会出现一个双滚动条,因此正确的CSS是:

  • 如果我创建了一个简单的应用程序,其中有一个活动,其中包含一个EditText,我会这样做 这样可以防止键盘出现(在我的Android5.0和7.1测试中)。这就是我想要的,正如这些问题所要求的: 从EditText禁用软键盘,但仍允许复制/粘贴 如何为特定活动禁用Android软键盘 Android:在所有编辑文本中禁用软键盘 如何在编辑文本时禁用键盘弹出 禁用编辑文本上的键盘 源代码是 但是我看

  • 这是这个问题的后续问题。 我的问题是:我将我们的环境升级到了JUnit、Mockito的较新版本……不幸的是,我是用最新的IBM JRE运行本地测试的。然后我们发现,在我们的构建环境中,我们所有的Mockito测试现在都失败了

  • 问题内容: 我正在用python为Ubuntu Linux编写一个防RSI /类型中断程序。我希望能够“锁定键盘”,以便忽略所有按键,直到“解锁”为止。我希望能够强迫用户休息一下。 我想以某种编程方式“立即”关闭键盘,直到我的程序稍后释放它(可能是0.1秒→10秒后)。当我“关闭键盘”时,不应将任何按键发送给任何窗口,窗口管理器等。最好,屏幕仍应显示相同的内容。即使此程序不在前字体且没有焦点,也应

  • 问题内容: 是否可以禁用滚轮在输入数字字段中更改数字?我已经弄乱了特定于Webkit的CSS,以删除微调框,但我想完全摆脱这种行为。我喜欢使用它,因为它在iOS上带来了一个不错的键盘。 问题答案: 防止其他对象建议的输入数字元素上的mousewheel事件的默认行为(调用“ blur()”通常不是首选方法,因为这不是用户想要的)。 但。我会避免一直监听所有input-number元素上的mouse