0

配列アダプターを使用してカスタム リストビューを作成しました。Edittext やその他のラジオボタンなどが含まれています。私のリストビューには、4 回のビューごとに繰り返しビューが表示されます。つまり、最初の Edittext を入力すると、5 番目の EditText にも入力されます。私はそれを読みました、メモリを節約するために、アンドロイドは限られたビューのみを作成し、それを繰り返します。では、この問題を克服するにはどうすればよいでしょうか。bindView() メソッドの使い方 そしてどこに?そしてどうやって?

ublic class QuestionAdapter extends ArrayAdapter{

Context context; 

int layoutResourceId;    
Question data[] = null;

public QuestionAdapter(Context context, int layoutResourceId, Question[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@SuppressLint("NewApi")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    final WeatherHolder holder;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();          
        row = inflater.inflate(layoutResourceId, parent, false);
        //row = inflater.inflate(R.layout.listview_item_row, null);
        holder = new WeatherHolder();
        holder.txtquestion = (TextView)row.findViewById(R.id.txtquestion);
        holder.radioYes = (RadioButton)row.findViewById(R.id.radioYes);
        holder.radioNo= (RadioButton)row.findViewById(R.id.radioNo);
        holder.editResponse=(EditText)row.findViewById(R.id.editResponse);
        holder.radio_group=(RadioGroup)row.findViewById(R.id.radio_group);

        row.setTag(holder);


    }
    else

    {
        holder = (WeatherHolder)row.getTag();
    }

    Question question = data[position];
    holder.txtquestion.setText(question.question);
    holder.radioYes.setChecked(true);
    holder.radioYes.setChecked(false);

    //holder.editResponse.setText("Edit Response");
    return row;

}



static class WeatherHolder
{
    TextView txtquestion;
    RadioButton radioYes;
    RadioButton radioNo;
    EditText editResponse;
    RadioGroup radio_group;
}

}

4

3 に答える 3

0

getView(...) の実装はどのように見えますか?

次のようになります。

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

    if(view == null)
        view = inflate(view, parent);

    MyObject obj = objects.get(position);
    if(obj != null)
        view = setUIControls(position, view, obj);

    return view;
}

new を膨らませるかView、 'old' を再利用しViewます。

于 2013-05-15T11:04:39.813 に答える
0

getView() では、EditText ごとに、各ビューの値を手動で割り当てる必要があります。getView で edtitext.setText("") を実行できます。1 つの edittext に書き込むと、リストビューは繰り返されません。

編集:

各 EditText にテキストを保存するための構造を持ち、getView() 内でこれらのテキストを EditText に割り当てることができます。

String [] text ;

Question data[] = null;

public QuestionAdapter(Context context, int layoutResourceId, Question[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;

    text = new String[data.length];

    for(String s: text)
        s="";
}

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    final WeatherHolder holder;
    final pos = position;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();          
        row = inflater.inflate(layoutResourceId, parent, false);
        //row = inflater.inflate(R.layout.listview_item_row, null);
        holder = new WeatherHolder();
        holder.txtquestion = (TextView)row.findViewById(R.id.txtquestion);
        holder.radioYes = (RadioButton)row.findViewById(R.id.radioYes);
        holder.radioNo= (RadioButton)row.findViewById(R.id.radioNo);
        holder.editResponse=(EditText)row.findViewById(R.id.editResponse);
        //Add a listener and you'll know the text inside EditText
        holder.editResponse.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            //Save text after typed it
            text[pos] = s.toString();

        }
    });

    holder.radio_group=(RadioGroup)row.findViewById(R.id.radio_group);

    row.setTag(holder);


}
else

{
    holder = (WeatherHolder)row.getTag();
}

    Question question = data[position];
    holder.txtquestion.setText(question.question);
    holder.radioYes.setChecked(true);
    holder.radioYes.setChecked(false);
    //Assign text
    holder.editResponse.setText(text[position]);
    return row;
}
于 2013-05-15T10:59:46.393 に答える
0

まず、VIEWの代わりにConvertViewを使用してください。これは役に立ちません。

if(convertView == null){
convertView=inflater.inflate....



return convertView;

次にfinal、viewHolderObject から修飾子を削除します。

Question data[] = null;// what the hell? if you want an array....
Question[] data=null;

ビューホルダーを共有する

class YourClass..{
private WeatherHolder holder;

そしていつconverView==null

if(convertView==null){
....
holder=new WeatherHolder();
于 2013-05-15T11:41:03.163 に答える