2015-09-21 4 views
1

У меня есть странные проблемы в течение нескольких дней, и я действительно надеюсь найти помощь здесь.Android Baseadapter TextEdit не работает

У меня есть ListView с использованием Baseadapter и так настроенных ячеек. Мои ячейки имеют ImageView и EditText.

Я хочу, чтобы пользователь вводил комментарий в EditText и загружал изображение, если он этого желает. Но теперь проблема: если я хочу загрузить ячейки на сервер, я ничего не могу получить. Я не могу прочитать информацию в поле TextEdit, и я не знаю, почему это происходит.

Вот мой код моего baseadapter:

package com.example.other; 

import java.util.List; 

import com.example.decidenow.R; 
import com.example.item.AnswerItem; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.EditText; 
import android.widget.ImageView; 


public class AnswerItemAdapter extends BaseAdapter { 

private Context context; 
protected List<AnswerItem> listCars; 
private LayoutInflater inflater; 

public AnswerItemAdapter(Context context, List<AnswerItem> listCars) { 
    this.listCars = listCars; 
    this.inflater = LayoutInflater.from(context); 
    this.context = context; 
} 

public int getCount() { 
    return listCars.size(); 
} 

public AnswerItem getItem(int position) { 
    return listCars.get(position); 
} 

public long getItemId(int position) { 
    return listCars.get(position).getID(); 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    final AnswerItem car = listCars.get(position); 
    ViewHolder holder; 

    if (convertView == null) { 

     holder = new ViewHolder(); 
     convertView = this.inflater.inflate(R.layout.new_poll_item, 
       parent, false); 

     holder.imageview = (ImageView) convertView 
       .findViewById(R.id.item_image); 
     holder.answer = (EditText) convertView 
       .findViewById(R.id.item_answer); 

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

    car.setAnswer(holder.answer); 
    car.setImageView(holder.imageview); 

    holder.imageview.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 

      Activity origin = (Activity) context; 
      origin.startActivityForResult(Intent.createChooser(intent, "uploading image"), car.getID()); 
     } 
    }); 
    return convertView; 
} 

private class ViewHolder { 
    ImageView imageview; 
    EditText answer; 
} 
} 

Мой заказ клетка:

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

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="8dp" 
    android:id="@+id/item_comment" 
    android:background="@color/main" 
    android:orientation="horizontal"> 
    <TextView 
     android:text="@string/answer_box" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="#ecf0f1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

<EditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/item_answer" 
    android:hint="@string/answer" /> 

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_gravity="center_horizontal" 
    android:gravity="center" 
    android:layout_weight="3.34"> 

    <ImageView 
     android:contentDescription="@string/empty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/item_image" 
     android:src="@drawable/insert_photo" 
     android:layout_gravity="center_horizontal" 
     android:adjustViewBounds="true" 
     android:maxWidth="80dp" 
     android:maxHeight="80dp" /> 

</LinearLayout> 
</LinearLayout> 

AnswerItem хранить клетки:

package com.example.item; 

import android.widget.EditText; 
import android.widget.ImageView; 

public class AnswerItem { 
private EditText answer; 
private ImageView view; 
private int ID; 

public AnswerItem(int i) { 
    ID = i; 
} 

public void setID(int i) { 
    ID = i; 
} 

public int getID() { 
    return ID; 
} 

public ImageView getImageView() { 
    return view; 
} 

public EditText getAnswer() { 
    return answer; 
} 

public void setImageView(ImageView v) { 
    view = v; 
} 

public void setAnswer(EditText a) { 
    answer = a; 
} 

} 

И те, которые некоторые части моей основной класс (деятельность):

... 
ListView list_poll_item; 
AnswerItemAdapter adapter; 
ArrayList<AnswerItem> arrayPolls = new ArrayList<>(); 
list_poll_item = (ListView) findViewById(R.id.list_answer); 
list_poll_item.setAdapter(adapter); 
... 
arrayPolls.get(i).getAnswer().getText().toString() 

И нет, у меня нет ошибок. Я просто получаю пустую строку EditText.

Я действительно надеюсь, что вы можете мне помочь, эта проблема очень раздражает. Спасибо заранее.

EDIT:UPDATE

Мой адаптер теперь выглядит так:

package com.example.other; 

import java.util.List; 

import com.example.decidenow.R; 
import com.example.item.AnswerItem; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.EditText; 
import android.widget.ImageView; 


public class AnswerItemAdapter extends BaseAdapter { 

private Context context; 
protected List<AnswerItem> listCars; 
private LayoutInflater inflater; 

public AnswerItemAdapter(Context context, List<AnswerItem> listCars) { 
    this.listCars = listCars; 
    this.inflater = LayoutInflater.from(context); 
    this.context = context; 
} 

public int getCount() { 
    return listCars.size(); 
} 

public AnswerItem getItem(int position) { 
    return listCars.get(position); 
} 

public long getItemId(int position) { 
    return listCars.get(position).getID(); 
} 

public View getView(int position, View convertView, ViewGroup parent)    { 
    final AnswerItem car = listCars.get(position); 
    ViewHolder holder; 

    if (convertView == null) { 
     holder = new ViewHolder(); 
     convertView = this.inflater.inflate(R.layout.new_poll_item, 
       parent, false); 

     holder.imageview = (ImageView) convertView 
       .findViewById(R.id.item_image); 
     holder.answer = (EditText) convertView 
       .findViewById(R.id.item_answer); 

     holder.myTextWatcher = new MyTextWatcher(holder.answer); 
     holder.answer.addTextChangedListener(holder.myTextWatcher); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.answer.setText(car.getComment()); 
    holder.myTextWatcher.setCar(car); 

    car.setImageView(holder.imageview); 

    holder.imageview.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 

      Activity origin = (Activity) context; 
      origin.startActivityForResult(Intent.createChooser(intent, "uploading image"), car.getID()); 
     } 
    }); 
    return convertView; 
} 

private class ViewHolder { 
    EditText answer; 
    ImageView imageview; 
    MyTextWatcher myTextWatcher; 
} 

private class MyTextWatcher implements TextWatcher { 

    private AnswerItem car; 
    private EditText mEditText; 

    public MyTextWatcher(EditText mEditText) { 
     this.mEditText = mEditText; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     if (car != null) { 
      car.setComment(mEditText.getText().toString()); 
     } 
    } 

    public void setCar(AnswerItem car) { 
     this.car = car; 
    } 
} 
} 
+0

Я не вижу, где вы используете 'EditText.getString()'? – hoomi

+0

Это самая последняя строка: arrayPolls.get (i) .getAnswer(). GetText(). ToString() @hoomi – yadbo

+0

Можете ли вы хотя бы поделиться, когда/как 'arrayPolls.get (i) .getAnswer(). GetText () .toString() 'вызывается? – hoomi

ответ

1

Проблема с кодом является то, что вы предполагаете, что у вас есть EditText для каждой строки. Это неверное предположение. Вероятно, у вас есть только 4-5 EditText экземпляров, которые имеют одинаковое значение для всех ваших строк.

Что вам нужно, вероятно, сделать это в ваших AnswerItem добавить еще одно поле и методы:

private String comment; 
public String getComment(){ 
    return comment; 
} 

public void setComment(String comment) { 
    return this.comment = comment; 
} 

Тогда это в вашем getView():

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = this.inflater.inflate(R.layout.new_poll_item, 
        parent, false); 

      holder.imageview = (ImageView) convertView 
        .findViewById(R.id.item_image); 
      holder.answer = (EditText) convertView 
        .findViewById(R.id.item_answer); 

      holder.myTextWatcher = new MyTextWatcher(holder.answer); 
      holder.answer.addTextChangedListener(holder.myTextWatcher); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     // The order needs to be exactly this way because setText will call 
     // AfterTextChanged on the previous row 
     holder.myTextWatcher.setCar(car); 
     holder.answer.setText(car.getComment()); 

     car.setImageView(holder.imageview); 

     holder.imageview.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 

       Activity origin = (Activity) context; 
       origin.startActivityForResult(Intent.createChooser(intent, "uploading image"), car.getID()); 
      } 
     }); 
     return convertView; 
    } 
} 

Вот другие классы, которые вам нужны:

private class ViewHolder { 
     EditText answer; 
     ImageView imageView; 
     MyTextWatcher myTextWatcher; 
    } 

private class MyTextWatcher implements TextWatcher { 

    private Car car; 
    private EditText mEditText; 

    public MyTextWatcher(EditText mEditText) { 
     this.mEditText = mEditText; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     if (car != null) { 
      car.setComment(mEditText.getText()); 
     } 
    } 

    public void setCar(Car car) { 
     this.car = car; 
    } 
} 
+0

** СПАСИБО ВАС ОЧЕНЬ МНОГО @ hoomi ** :-) Он отлично работает до сих пор, но когда я обновляюсь после добавления нового объекта в список, мой текст исчезает ... Обновление: 'адаптер .notifyDataSetChanged(); ' – yadbo

+0

жаль, что я понял это позже ... мог бы помочь мне и здесь? – yadbo

+0

Хорошо, позвольте мне взглянуть на него. – hoomi