2012-06-07 13 views
8

Mam Checkbox i EditText oraz widok tekstowy w liście. Dostaje wartość dla widoku tekstowego z listy. Pole wyboru będzie sprawdzane dynamicznie. W ten sam sposób EditText można również wprowadzić dynamicznie. Teraz mój problem polega na tym, że gdy przewijam widok listy (w górę i w dół) po wprowadzeniu tekstu w tekście edycji, nie mogę uzyskać wpisanej wartości. Zaznaczam też to pole wyboru. Ale używając pozycji, ustawiłem ją poprawnie. Nie mogłem wiedzieć Jak poprawnie ustawić wartość EditText na liście. Proszę pomóż mi. Tu jest mój kodu:Jak dodać EditText do listy i uzyskać jego wartość dynamicznie we wszystkich wierszach?

main.xml: (Główny xml do startu)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<ListView 
android:id="@+id/my_list" 
android:layout_width="fill_parent" 
android:layout_height="250px" /> 
<Button 
android:text="Save" 
android:id="@+id/btnSave" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"/> 

</LinearLayout> 

row.xml: (ListView Row)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<TextView 
android:id="@+id/label" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@+id/label" 
android:textSize="30sp"/> 

<CheckBox 
android:id="@+id/check" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"/> 
<EditText 
android:text="" 
android:id="@+id/txtAddress" 
android:layout_width="150px" 
android:layout_height="wrap_content"/> 
</LinearLayout> 

Model.Java: (To POJO klasa)

package com.checkboxlistview; 

public class Model { 

private String name; 
private boolean selected; 
private String address; 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Model(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public boolean isSelected() { 
    return selected; 
} 

public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

} 

MyAdapter.Java: (To jest używane do przechowywania widoku w widoku listy przy użyciu konwertera i uchwyt)

package com.checkboxlistview; 

import java.util.List; 
import android.app.Activity; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MyAdapter extends ArrayAdapter<Model> implements TextWatcher { 

private final List<Model> list; 
private final Activity context; 
int listPosititon; 

public MyAdapter(Activity context, List<Model> list) { 
    super(context, R.layout.row, list); 
    this.context = context; 
    this.list = list; 
} 

static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
    protected EditText address; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    listPosititon = position; 
    ViewHolder viewHolder = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     convertView = inflator.inflate(R.layout.row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) convertView 
       .findViewById(R.id.check); 
     viewHolder.address = (EditText) convertView 
       .findViewById(R.id.txtAddress); 
     viewHolder.checkbox 
       .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

@Override 
public void onCheckedChanged(CompoundButton buttonView, 
boolean isChecked) { 
int getPosition = (Integer) buttonView.getTag(); 
//Here we get the position that we have set for the checkbox using setTag. 
list.get(getPosition).setSelected(
buttonView.isChecked()); 
// Set the value of checkbox to maintain its state. 
} 
}); 
     viewHolder.address.addTextChangedListener(this); 

     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.label, viewHolder.text); 
     convertView.setTag(R.id.check, viewHolder.checkbox); 
     convertView.setTag(R.id.txtAddress, viewHolder.address); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.checkbox.setTag(position); // This line is important. 

    viewHolder.text.setText(list.get(position).getName()); 
    viewHolder.checkbox.setChecked(list.get(position).isSelected()); 
    if (list.get(position).getAddress() != null) { 
     viewHolder.address.setText(list.get(position).getAddress() + ""); 
    } else { 
     viewHolder.address.setText(""); 
    } 

    return convertView; 
} 

@Override 
public void afterTextChanged(Editable s) { 
    list.get(listPosititon).setAddress(s.toString()); 
} 

@Override 
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
     int arg3) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 

} 
} 

MainActivity.java (Jest to czynność):

package com.checkboxlistview; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
ListView listView; 
Button btnSave; 
    ArrayAdapter<Model> adapter; 
    List<Model> list = new ArrayList<Model>(); 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     listView = (ListView) findViewById(R.id.my_list); 
     btnSave = (Button)findViewById(R.id.btnSave); 
     adapter = new MyAdapter(this,getModel()); 
     listView.setAdapter(adapter); 
     btnSave.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       for (int i = 0; i < list.size(); i++) { 
        Toast.makeText(getBaseContext(), "Name : "+list.get(i).getName() +" Selected: "+list.get(i).isSelected(), Toast.LENGTH_SHORT).show(); 

       } 
      } 
     }); 
    } 


    private List<Model> getModel() { 
     list.add(new Model("Linux")); 
     list.add(new Model("Windows7")); 
     list.add(new Model("Suse")); 
     list.add(new Model("Eclipse")); 
     list.add(new Model("Ubuntu")); 
     list.add(new Model("Solaris")); 
     list.add(new Model("Android")); 
     list.add(new Model("iPhone")); 
     list.add(new Model("Java")); 
     list.add(new Model(".Net")); 
     list.add(new Model("PHP")); 
     return list; 
    } 
} 

nie ma błędu w kodzie. Działa dobrze. Mógłbym utrzymać pozycję i wyświetlać pole wyboru w tej samej pozycji, nawet gdy przewijam w górę iw dół. Ale nie mogłem uzyskać i ustawić wartości EditText poprawnie. Proszę pomóż mi. Z góry dzięki.

Odpowiedz

4

można to osiągnąć, korzystając z niestandardowego widoku listy.

znaleźć przykład ListView z EditText jest here

+0

Hi Munish Kapoor, Dzięki za odpowiedź. Mi to pasuje. Użyłem AddTextChangedListener, aby pobrać tekst z EditText. Ale używając twojej próbki dowiedziałem się, że musimy użyć setOnFocusChangeListener. Wielkie dzięki. Próbowałem tego przez dwa dni. – Mathew

+0

Twoje powitanie .. :) –

+0

Hi Munish Kapoor, Mam inny problem w tym polu wyboru i edittext z widokiem listy. Kiedy klikam pole wyboru, musi ono skupiać się na określonym wierszu EditText. Jak to zrobić. Proszę pomóż mi. – Mathew

0

Wystarczy zachować viewHolder.address.setTag (opcja) i to działa idealny okrzyki.

Adapter Klasa:

package com.qzick.adapter; 

import java.util.ArrayList; 
import android.content.Context; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.example.qzick.R; 
import com.qzick.model.Get_All_Class_Model; 

public class Get_Class_Adapter extends BaseAdapter { 
    protected ArrayList<Get_All_Class_Model> get_class_details; 
    LayoutInflater inflater; 
    Context context; 
    private int x = 1; 

    public Get_Class_Adapter(Context context, 
      ArrayList<Get_All_Class_Model> get_class_details) { 
     this.get_class_details = get_class_details; 
     this.inflater = LayoutInflater.from(context); 
     this.context = context; 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return get_class_details.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return get_class_details.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

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

      holder.textclass = (TextView) convertView 
        .findViewById(R.id.text_class_ll); 

      holder.txtid = (TextView) convertView.findViewById(R.id.text_id_ll); 

      holder.checkclass = (CheckBox) convertView 
        .findViewById(R.id.check_class_LL); 

      holder.edtsection = (EditText) convertView 
        .findViewById(R.id.edttxt_addsection_ll); 

      holder.checkclass 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 

          int getPosition = (Integer) buttonView.getTag(); 

          get_class_details.get(getPosition).setChecked(
            buttonView.isChecked()); 

          notifyDataSetChanged(); 
         } 
        }); 

      convertView.setTag(holder); 
      convertView.setTag(R.id.check_class_LL, holder.checkclass); 
      convertView.setTag(R.id.edttxt_addsection_ll, holder.edtsection); 

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

     holder.checkclass.setTag(position); 
     holder.edtsection.setTag(position); 

     holder.edtsection.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       int pos = (Integer) holder.edtsection.getTag(); 

       get_class_details.get(pos).setEdtsections(s.toString()); 

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

     holder.txtid.setText(get_class_details.get(position).getId()); 
     holder.textclass.setText(get_class_details.get(position).getText()); 
     holder.edtsection.setText(get_class_details.get(position) 
       .getEdtsections()); 

     holder.textclass.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       x++; 

       if (x % 2 == 0) { 
        holder.checkclass.setChecked(false); 

       } else { 
        holder.checkclass.setChecked(true); 
       } 

      } 
     }); 

     holder.checkclass.setChecked(get_class_details.get(position) 
       .isChecked()); 
     return convertView; 
    } 

    private class ViewHolder { 
     TextView textclass, txtid;`enter code here` 
     CheckBox checkclass; 
     EditText edtsection; 
    } 
} 
Powiązane problemy