Получение ссылки на mEdit в классе ListAdapter

Это мой класс адаптера настраиваемого списка:

class MyAdapter extends ArrayAdapter<String> {
    private int resourceId;
    String name = "";
    String phone;
    private ArrayList<String> sites = null;
    private Context context;


    private static  class ViewHolder{
        TextView RideDetails;
        EditText mEdit;
    }

    public MyAdapter(Context context, int resource, ArrayList<String> objects,String phone) {
        super(context, resource, objects);
        this.context = context;
        this.resourceId = resource;
        this.sites = objects;
        this.phone=phone;
    }

    @Override
    public String getItem(int position) {
        return sites.get(position);
    }

    @Override
    public int getCount() {
        return sites.size();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        name = getItem(position);
        View view = convertView;
        if (view == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            view = inflater.inflate(R.layout.home_resource, parent, false);
        }
        TextView mTextView = (TextView) view.findViewById(R.id.ridedetails);
        mTextView.setText(name);
        Button mButton = (Button) view.findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("Name",name);
                String ridetrackno=name.substring(name.indexOf(":")+1,name.indexOf("Source")-2);

                EditText mEdit;
                mEdit   = (EditText) view.findViewById(R.id.PriceQuotation);
                String fare=mEdit.getText().toString();


                String myUrl = ".....API URL....."+phone+"/"+ridetrackno+"/"+fare;
                Log.d("URL",myUrl);
                HttpGetRequest getRequest = new HttpGetRequest();
                try{
                    String result = getRequest.execute(myUrl).get();
                    Log.d("Details:",result);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        });

        return view;
    }
} 

Это мой файл ресурсов, в который элементы вводятся через REST API:

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout
    android:id = "@+id/relativeLayout1"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    xmlns:android = "http://schemas.android.com/apk/res/android"
    android:padding = "5dip">
    <TextView
        android:layout_height = "wrap_content"
        android:text = "TextView"
        android:layout_width = "wrap_content"
        android:id = "@+id/ridedetails"
        android:layout_marginLeft = "2dip">
    </TextView>

    <EditText
        android:layout_height = "wrap_content"
        android:hint = "Quote Price"
        android:layout_width = "wrap_content"
        android:id = "@+id/PriceQuotation"
        android:layout_below = "@+id/ridedetails"
        android:layout_marginLeft = "2dip">
    </EditText>

    <Button
        android:id = "@+id/button"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_alignTop = "@+id/PriceQuotation"
        android:layout_marginStart = "61dp"
        android:layout_toEndOf = "@+id/PriceQuotation"
        android:text = "Button" />


</RelativeLayout>

Структура просмотра списка:

Каждый элемент списка состоит из TextView (детали которого я могу получить), Edit Text (вызывающего исключение) и простой кнопки, для которой была написана функция onClick.

Теперь я столкнулся с двумя проблемами:

  1. Ссылка на mEdit: программа выдает ошибку с исключением нулевого указателя, когда я пытаюсь получить текст, введенный в Edit Text, при нажатии кнопки в элементе списка.

  2. Выбран всегда последний элемент списка: независимо от того, какая кнопка нажата, возвращается только содержимое последнего TextView.

0
0
40
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
  1. Адаптер получит все представления в методе getView сразу, вы пытаетесь получить edittext в прослушивателе нажатия кнопки

напишите эту строку за пределами прослушивателя нажатия кнопки

final EditText mEdit   = (EditText) view.findViewById(R.id.PriceQuotation);

2.

final TextView mTextView = (TextView) view.findViewById(R.id.ridedetails);

Слушатель нажатия кнопки внутри

String vlaue = mTextView.getText().toString();

getView () Код:

@Override
public View getView ( final int position, View convertView, ViewGroup parent){
    name = getItem(position);
    View view = convertView;

    if (view == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        view = inflater.inflate(R.layout.home_resource, parent, false);
    }

    final TextView mTextView = (TextView) view.findViewById(R.id.ridedetails);
    mTextView.setText(name);

    final EditText mEdit = (EditText) view.findViewById(R.id.PriceQuotation);

    Button mButton = (Button) view.findViewById(R.id.button);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String vlaue = mTextView.getText().toString();

            Log.d("Name", vlaue);

            String ridetrackno = vlaue.substring(vlaue.indexOf(":") + 1, vlaue.indexOf("Source") - 2);
            String fare = mEdit.getText().toString();

            String myUrl = ".....API URL....." + phone + "/" + ridetrackno + "/" + fare;
            Log.d("URL", myUrl);
            HttpGetRequest getRequest = new HttpGetRequest();
            try {
                String result = getRequest.execute(myUrl).get();
                Log.d("Details:", result);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    return view;
}

Спасибо за помощь. Теперь я могу получить набор текста в EditText. Пожалуйста, также помогите мне со второй проблемой, когда независимо от того, какую кнопку я нажимаю, всегда выбирается последний элемент в списке.

amitabh tiwari 21.03.2018 12:17

Вам нужно было поставить EditText mEdit либо из события ButtononClick(), либо вам нужно изменить имя объекта view, как показано ниже.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    name = getItem(position);
    View childView = convertView;
    if (childView == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        childView = inflater.inflate(R.layout.home_resource, parent, false);
    }
    TextView mTextView = (TextView) childView.findViewById(R.id.ridedetails);
    mTextView.setText(name);
    Button mButton = (Button) childView.findViewById(R.id.button);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EditText mEdit = (EditText) childView.findViewById(R.id.PriceQuotation);
        }
    });

}

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

Это не даст вам NullPointerException.

Для 2. внутри onClick Попробуйте:

String namePos = getItem(position);

ridetrackno=namePos.substring(namePos.indexOf(":")+1,namePos.indexOf("Source")-2);

Надеюсь это поможет

Другие вопросы по теме