Это мой класс адаптера настраиваемого списка:
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.
Теперь я столкнулся с двумя проблемами:
Ссылка на mEdit: программа выдает ошибку с исключением нулевого указателя, когда я пытаюсь получить текст, введенный в Edit Text, при нажатии кнопки в элементе списка.
Выбран всегда последний элемент списка: независимо от того, какая кнопка нажата, возвращается только содержимое последнего TextView.
напишите эту строку за пределами прослушивателя нажатия кнопки
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 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);
Надеюсь это поможет
Спасибо за помощь. Теперь я могу получить набор текста в EditText. Пожалуйста, также помогите мне со второй проблемой, когда независимо от того, какую кнопку я нажимаю, всегда выбирается последний элемент в списке.