ListView und Baseadapter

  • 4 Antworten
  • Letztes Antwortdatum
T

Tru5T

Neues Mitglied
0
Hi,

ich entwickle seit kurzem eine App mit ListViews. Diese ListViews werden durch einen Baseadapter gefüllt. Das Layout eines solchen Adapters besteht aus drei Teilen, ImageView, EditView und ImageView. Der EditView sollte ermöglichen, dass ich neue Passwörter in eine Liste eintragen kann. Wenn ich ein EditText-Item anklick, dann lädt die ListView neu. Durch das neu laden, kann ich keinen Text eingeben, weil die List sofort neu geladen wird...
Ich habe versucht mit wait() den Thread, der den ListView aktualisiert, zu unterbrechen, um zu verhindern, dass jedes Mal die List neu geladen wird ohne, dass ich etwas eingeben kann. Allerdings hat das leider nicht funktioniert...
Hat jemand eine Idee wir ich das Problem lösen kann?

Grüße
Tru5T
 
Etwas Code wäre da sehr hilfreich.
 
Ich wusste nicht genau welcher Code-Teil nützlich ist... Ich poste einfach mal alles:

Code:
public class ListviewRowExtended extends BaseAdapter implements View.OnClickListener,TextWatcher,View.OnTouchListener{

    ListView lstPassword;
    ArrayList<SingleRowExtended> ALlist;
    Context Ccontext;
    int ITimage;
    int ITimageDEL;

    public ListviewRowExtended(Context c, List<String> items, ListView l) {
        ALlist = new ArrayList<SingleRowExtended>();
        Ccontext = c;
        lstPassword = l;
        ITimage = R.drawable.listview_ext;
        ITimageDEL = R.drawable.listview_del;
        refreshList();
    }

    @Override
    public int getCount() {
        return ALlist.size();
    }

    @Override
    public Object getItem(int i) {
        return ALlist.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) Ccontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.listview_row_extended,viewGroup,false);

        EditText text = (EditText) row.findViewById(R.id.txtRowExt);
        ImageView image = (ImageView) row.findViewById(R.id.imgRowExt);
        ImageView imageDEL = (ImageView) row.findViewById(R.id.imgDel);

        SingleRowExtended item = ALlist.get(i);
        text.setText(item.text);

        text.addTextChangedListener(this);
        text.setOnTouchListener(this);

        image.setImageResource(item.image);
        imageDEL.setImageResource(item.imageDEL);
        imageDEL.setOnClickListener(item.Click);

        return row;
    }

    @Override
    public void onClick(View view) {
        ImageView imgTemp = (ImageView)view;
        RelativeLayout relativeLayout = (RelativeLayout)imgTemp.getParent();
        TextView txtDelPassword = (TextView)relativeLayout.findViewById(R.id.txtRowExt);
        String del_password = txtDelPassword.getText().toString();

        List<String> listTemp = Argument.passwordList;

        int i = 0;
        for (String p : listTemp) {
            if(p.equals(del_password)) {
                Argument.passwordList.remove(i);
                break;
            }
            i++;
        }
        refreshList();
        lstPassword.invalidateViews();
    }

    public void refreshList() {
        ALlist.removeAll(ALlist);
        for(int i = 0;i<Argument.passwordList.size();i++) {
            ALlist.add(new SingleRowExtended(Argument.passwordList.get(i),ITimage,ITimageDEL,this,this));
        }
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        String new_password = editable.toString();
        int i;
        for(i=0;i<ALlist.size();i++) {
            TextView txtTemp = (TextView)lstPassword.findViewById(R.id.txtRowExt);
            if(new_password.equals(txtTemp.getText().toString())) {
                break;
            }
        }
        Argument.passwordList.remove(i-1);
        Argument.passwordList.add(i-1,new_password);
        refreshList();
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        EditText txtTemp = (EditText)view;



        return false;
    }

    private class SingleRowExtended {
        String text;
        int image;
        int imageDEL;
        View.OnClickListener Click;
        TextWatcher watcher;

        public SingleRowExtended(String s, int i, int id, View.OnClickListener c, TextWatcher w) {
            text = s;
            image = i;
            imageDEL = id;
            Click = c;
            watcher = w;
        }
    }
}
 
HI,

schau dir erstmal das hier an.
Sonst macht res dich früher oder später wahnsinnig :)

Dein Problem, so auf den ersten blick, ist der onClickListener:
Code:
...
public void onClick(View view) {
....
   refreshList();
}
Das bedeutet, dass jedesmal wenn du klickst, egal wohin, egal wie lange, jedes mal die liste neu aktualisiert wird.. Was ja dein Problem ist :D

Kannst du nicht besser die einzelnen Clicks auf die Views legen, statt auf die Liste?

Gruß
 
Hey,

ich konnte das Problem lösen, ich musste einfach nur das
aus dem Konstruktor löschen und in meiner Activity nach der Listeninitialisierung aufrufen :D

Danke für eure Hilfe!

Grüße
 
Zuletzt bearbeitet:
Zurück
Oben Unten