1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ListView mit EditText - Eingabe wird nicht übernommen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 25.01.2012.

  1. Tom299, 25.01.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hallo,

    ich bin gerade total am verzeifeln. Hab in meinem Projekt eine ListView, die u.a. EditText Views enthält. Android Version ist 2.3.3.

    Die Eingaben, die ich in den EditTexten mache, werden immer wieder zurückgesetzt und ich kapiers einfach nicht mehr.

    In meinem richtigen Projekt hab ich noch FocusListener, TextWatcher und InputFilter dabei, aber ich hab nun ein Testprojekt angelegt, erst mal ganz ohne diese Listener und habe das gleiche Verhalten ...

    Vielleicht hat jemand eine Idee, woran es liegen könnte, daß die Eingabe immer wieder zurückgesetzt wird.

    Außerdem wird die Numerische Tastatur immer durch die Text-Tastatur überblendet. Für das EditText gilt android:inputType="numberDecimal" und die Num-Tastatur kommt auch beim Klick, aber direkt danach wird sie überblendet, was ich auch nicht verstehe. Das hat alles schon mal funktioniert ...

    (Übrigens, in meinem richtigen Projekt mit TextWatcher bekomm ich beim Aufrufen der View schon 2 oder 3 mal ein TextChange für jedes Edit-Element auf der ListView. Und wenn ich in 1 Feld was ändere werden alle Felder wieder auf ihren letzten Wert gesetzt ... alles komisch)

    Im Anhang hab ich das Test-Projekt als Zip-File, falls es sich mal jemand ansehen möchte.

    Die Klassen und XML sehen so aus:
    Code:
    public class EditListViewTestActivity extends Activity {
    
    	private ListView listViewUser = null;
    	private UserArrayAdapter adapterUser;
    	private ArrayList<User> listUser;
    
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
    		listViewUser = (ListView)findViewById(R.id.user_listView);
    		listUser = new ArrayList<User>();
    		adapterUser = new UserArrayAdapter(this, R.layout.user_table_item, listUser);
    		listViewUser.setAdapter(adapterUser);
    		
    		listUser.add(new User("AAAAA", 12));
    		listUser.add(new User("BBBBB", 22));
    		listUser.add(new User("CCCCC", 32));
    		listUser.add(new User("DDDDD", 42));
    		listUser.add(new User("EEEEE", 52));
    		
    		adapterUser.notifyDataSetChanged();
        }
        
    }
    
    Code:
    public class UserArrayAdapter extends ArrayAdapter<User> {
    
    	private int resource;
    	private TableLayout userView;
    	
    	
    	public UserArrayAdapter(Context context, int resourceId, List<User> listUser) {
    		super(context, resourceId, listUser);
    		this.resource = resourceId;		
    	}
    
    	@Override
    	public View getView(final int position, View convertView, ViewGroup parent) {
    		final User user = getItem(position);
    		
    		if (convertView == null) {
    			userView = new TableLayout(getContext());
    			LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    			inflater.inflate(resource, userView, true);			
    		}
    		else {
    			userView = (TableLayout)convertView;
    		}
    		
    		TextView tvName = (TextView)userView.findViewById(R.id.user_tvName);
    		tvName.setText(user.getName());
    		
    		EditText editAge = (EditText)userView.findViewById(R.id.user_editAge);
    		editAge.setText(user.getAge().toString());
    		
    		return userView;
    	}
    }
    
    main.xml
    Code:
    <?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" >
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello" 
        />
    
        <ListView 
        	android:id="@+id/user_listView"
        	android:layout_width="fill_parent" 
        	android:layout_height="wrap_content"
        	android:descendantFocusability="beforeDescendants"
        	android:divider="@android:color/black"
        	android:dividerHeight="1dp"
        />
    </LinearLayout>
    
    user_table_item.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <TableLayout
      	xmlns:android="http://schemas.android.com/apk/res/android"
      	android:layout_width="fill_parent"
      	android:layout_height="fill_parent">
      	<TableRow
      		android:id="@+id/user_table_item_row" 
    		android:layout_width="fill_parent" 
       		android:layout_height="wrap_content"
     		android:paddingTop="3dp"
       		>
    	    <TextView 
    	    	android:id="@+id/user_tvName" 
    	    	android:layout_width="0dp"
    	    	android:layout_weight="0.5" 
    	    	android:layout_height="wrap_content"
    	    	android:singleLine="true"
    	    	android:textAppearance="@android:style/TextAppearance.Medium"
    	    	android:paddingLeft="3dp"
    	    	android:gravity="left|center_vertical"
        	/>
    	    <EditText 
    			android:id="@+id/user_editAge"  
    	    	android:layout_width="0dp"
    	    	android:layout_weight="1.0"
    	    	android:layout_height="wrap_content"
    	    	android:textAppearance="@android:style/TextAppearance.Medium"
    	    	android:singleLine="true"
    	    	android:inputType="numberDecimal"
    	    	android:gravity="center_vertical"
    	    />
      	</TableRow>  	
    </TableLayout>
    
    
    PS: Ich hab die ListView auch schon ohne android:descendantFocusability="beforeDescendants" versucht, bringt aber nichts.
     

    Anhänge:

  2. Tom299, 25.01.2012 #2
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Trägt man in der manifest android:windowSoftInputMode="adjustPan" für die Activity ein, dann verhält sich die Tastatur normal und die Nummern-Eingabe bleibt da.

    Mit dem TextWatcher hab ich danach nur Probleme gehabt, bin jetzt wieder zu meinem FocusListener zurück und frage focusLost ab. Beim drücken des Back-Button erzwinge ich nun einen FocusLost, damit meine Eingabe auch erkannt wird, falls ich direkt nach der Eingabe mit BACK die Activity verlasse.
     

Diese Seite empfehlen