Как собрать входные данные из всех редактируемых текстовых полей в списке, сделанном с использованием повторного просмотра? - PullRequest
0 голосов
/ 18 мая 2019

Я работаю над приложением, в котором одно из действий использует представление списка переработчика, чтобы получать входные данные от пользователя. Представление списка заполнено одним представлением текста и одним представлением редактирования текста.

Итак, представьте, у меня есть три пункта в списке. Мне нужны входные данные трех редактируемых текстовых представлений в разных переменных, чтобы я мог использовать эти входные данные в других действиях. В моем приложении количество элементов в списке зависит от ввода пользователя в предыдущем действии.

Поэтому я не могу понять, как взять входные данные от каждого элемента в этом списке и сохранить его отдельно, так как список составлен с использованием пользовательского класса адаптера.

Myadapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private ArrayList<Mydata> items;

View v;
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(ArrayList<Mydata> mydata) {
    this.items = mydata;
}


// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder



public static class MyViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public View view;
    public MyViewHolder(View v) {
        super(v);
        view = v;
    }
}


// Create new views (invoked by the layout manager)
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    RecyclerView.ViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    // create a new view
    v = inflater.inflate(R.layout.subjectentry, parent, false);
     return new MyViewHolder(v);
}





// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
   TextView SubjectNumber = (TextView) holder.view.findViewById(R.id.subjectNumber);
    EditText SubjectName = (EditText)holder.view.findViewById(R.id.subjectName);

    SubjectNumber.setText(items.get(position).getSubNumber());
    SubjectName.setText(items.get(position).getSubName());

}



// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return items.size();
}

}

subjectentry.xml

<TextView
    android:id="@+id/subjectNumber"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:background=" #197ee3"
    android:hint="Number"
    android:padding="10dp"
    android:layout_marginTop="45dp"
    android:textColor="@color/colorPrimary"
    android:textColorHint="@color/colorPrimary"
    android:textSize="20dp"
    android:textStyle="bold" />

<EditText
    android:id="@+id/subjectName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@id/subjectNumber"
    android:layout_alignBottom="@+id/subjectNumber"
    android:layout_marginStart="48dp"
    android:layout_toEndOf="@+id/subjectNumber"
    android:background="#8cbef1"
    android:padding="10dp"
    android:textColor="@color/colorPrimaryDark" />

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Вы можете создать интерфейс для уведомления активности для изменения ввода (EditText) и сохранения нового значения.

создайте файл InputListener.java и напишите:

public interface InputListener{
   void onChangeInputValue(String newValue, int position);
}

в вашей деятельности реализуйте интерфейс:

public class MainActivity extends Activity implement InputListener {
    //...

    @Override
    public void onChangeInputListener(String newValue, int position) {
        // here you can collect input data of each editText
    }

    //...
}

и в конструкторе вашего адаптера вы должны получить объект InputListener. (в этом примере MainActivity является экземпляром InputListener)

Раздел кода RecyclerView:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
     private ArrayList<Mydata> items;
     private InputListener listener;

     public MyAdapter(ArrayList<Mydata> mydata, InputListener listener) {
         this.items = mydata;
         this.listener = listener;
     }

  public static class MyViewHolder extends RecyclerView.ViewHolder {
         public EditText subjectName;
         public TextView subjectNumber;

         public MyViewHolder(View v) {
             super(v);
             SubjectNumber = (TextView) holder.view.findViewById(R.id.subjectNumber);
             SubjectName = (EditText)holder.view.findViewById(R.id.subjectName);

         }
     }

     @Override
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

         RecyclerView.ViewHolder viewHolder;
         LayoutInflater inflater = LayoutInflater.from(parent.getContext());
         v = inflater.inflate(R.layout.subjectentry, parent, false);
          return new MyViewHolder(v);
     }

     @Override
     public void onBindViewHolder(MyViewHolder holder, int position) {
         SubjectNumber.setText(items.get(position).getSubNumber());
         SubjectName.setText(items.get(position).getSubName());

        SubjectName.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) {
                 listener.onChangeInputValue(charSequence, position);
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
    });
     }


     @Override
     public int getItemCount() {
         return items.size();
     }
0 голосов
/ 18 мая 2019

Вы можете получить значение для редактирования текста в адаптере и отправить данные через LocalBroadcastManager

LocalBroadcastManager.getInstance (контекст) .sendBroadcast (намерение);

public View getView(final int position, @Nullable View convertView, @NonNull final ViewGroup parent) {

        ViewHolder holder = null;
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.spinner, null, true);
            holder.spinner = convertView.findViewById(R.id.scan_name);
            holder.rate = convertView.findViewById(R.id.scan_rate);
            holder.floa=convertView.findViewById(R.id.sca);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder)convertView.getTag();

        }

        final scan_setter row_pos = rowItems.get(position);

        status=0;
         pos=getCount();

        holder.spinner.setText(row_pos.getPname());
        holder.rate.setText(row_pos.getPrate());

        holder.floa.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                dvalue= Integer.parseInt(row_pos.getPrate());
                Intent intent = new Intent("custom-message");
                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
                intent.putExtra("key",dvalue);
                rowItems.remove(position);
                notifyDataSetChanged();

            }
        });

        return convertView;

    }
}
...