Listview z własnym adapterem

0

Witam
Poszukuje rozwiązanie następującego problemu.
Mam własny adapter klasa dziedzicząca po BaseAdapter a w niej min. EditText i ImageView
odpaliłem Textwatcher a dane z edittextów chciał bym odpierać w głównej activity.
Niestety NullPointerException - wszystkie dane są pełne jeśli taki sam TexWatcher odpalę z głównej klasy a nie z klasy BaseAdapter to wszystko śmiga
klasa adapter listy

 


import android.content.Context;
import android.graphics.Bitmap;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
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 List_new extends BaseAdapter {


    private Context mctx;
    private String[] wla;
    private Bitmap[] bmps;
    private Bitmap[] bmpC;

    public List_new (Context ctx, String[] wlac, Bitmap[] bmp, Bitmap[] Cbmp) {
        super();
        this.wla=wlac;
        this.mctx = ctx;
        this.bmps = bmp;
        this.bmpC = Cbmp;

    }

    public int getCount() {
        return bmps.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    private class ViewHolderPattern {
        ImageView img_w_layoucie;
        ImageView img_2;
        EditText edit_w_layoucie;
        List_new list_new;
    }

    public View getView(final int position, View convertView, final ViewGroup parent) {


        ViewHolderPattern view_holder;



          if (convertView == null) {

              LayoutInflater inflater = (LayoutInflater) mctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              convertView = inflater.inflate(R.layout.activity_list_new, parent, false);

              view_holder = new ViewHolderPattern();
              view_holder.img_w_layoucie = (ImageView) convertView.findViewById(R.id.imageView1);
              view_holder.img_w_layoucie.setTag(view_holder.list_new);
              view_holder.img_2 = (ImageView) convertView.findViewById(R.id.imageView);
              view_holder.img_2.setTag(view_holder.list_new);
              view_holder.edit_w_layoucie = (EditText) convertView.findViewById(R.id.editText);
              view_holder.edit_w_layoucie.setTag(view_holder.list_new);
             // view_holder.list_new = wla.get(position);

              view_holder.edit_w_layoucie.addTextChangedListener(new TextWatcher() {
                  @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) {

                      if(editable.toString().length()==4)
                      {
                      
                          Galeria gal= new Galeria();
                          gal.Call_list(editable.toString(),position);}
                      Log.v("clasa","str " + editable.toString() + " position " + position);
                   
                  }
              });
              convertView.setTag(view_holder);

    } else {
               view_holder = (ViewHolderPattern) convertView.getTag();
    }



        view_holder.edit_w_layoucie.setText(wla[position]);
        view_holder.img_w_layoucie.setImageBitmap(bmps[position]);
        view_holder.img_2.setImageBitmap(bmpC[position]);
        return convertView;
      //  return ch;
    }


}

główna activity

 

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.content.SharedPreferences;
import android.widget.ListView;
import java.util.ArrayList;
import java.io.File;


public class Galeria extends Activity {

    String IP;
    SharedPreferences.Editor editor ;
     boolean[] wl = new boolean[8];
     int[] bmID = new int[8];
    Bitmap[] bitmapki = new Bitmap[8];
    Bitmap[] bitmapTRUE = new Bitmap[8];
    public Bitmap[] bitmapC = new Bitmap[8];
    String[] Ceny = new String[8];
    ListView lista ;
    private File[] czerwone;
    private File[] zielone;
    private File[] zolte;
    private File CzerwoneS = new File( "/mnt/sdcard/external_sdcard/Images/32x16S/Czerwony/");
    private File ZieloneS = new File("/mnt/sdcard/external_sdcard/Images/32x16S/Zielone/");
    private File ZolteS = new File("/mnt/sdcard/external_sdcard/Images/32x16S/Zolte/");
    public ArrayList<Bitmap> a=new ArrayList<Bitmap>();
    Bitmap[] CzerwoneB = new Bitmap[20];
    Bitmap[] ZieloneB = new Bitmap[12];
    Bitmap[] ZolteB = new Bitmap[12];
    EditText testowy;
    public Galeria(){}
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_galeria);
        SharedPreferences prefs = this.getSharedPreferences("pl.xx.www.pyldroid", Context.MODE_PRIVATE);

        lista = (ListView) findViewById(R.id.listView);
        testowy = (EditText) findViewById(R.id.editText2);

        testowy.addTextChangedListener(new TextWatcher() {
            @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) {

                if(editable.toString().length()==4)
                {
                    //   addExpenseModel.setAmount(editable.toString());

                    Call_list(editable.toString(), 2);}

                //  notifyDataSetChanged();

            }});
//-------------------------------odczyt danych
        editor = prefs.edit();
        IP=(prefs.getString("IP_A", "192.168.1.199"));
      //  jasnosc=(prefs.getInt("Bri", 0));
        // int size = prefs.getInt(wl + "_size", 0);
        int index =0;
        for(int i=0;i<8;i++){
            wl[i] = prefs.getBoolean("wl_" + i, true);
            bmID[i]=prefs.getInt("bm_" + i, i);
            bitmapki[i] = BitmapFactory.decodeResource(getResources(), bmID[i]);
            if (wl[i]==true) {
                bitmapTRUE[index] = bitmapki[i];
                index++;
            }}
        String[] Ceny = new String[index];
        Bitmap[] bitmapTRUE = new Bitmap[index];
        index=0;
            for(int i=0;i<8;i++) {
                if (wl[i] == true) {
                    bitmapTRUE[index] = bitmapki[i];
                    index++;
                }
            }
        //--------------------------zaladowanie obrazkow
        czerwone = CzerwoneS.listFiles();
        zielone = ZieloneS.listFiles();
        zolte = ZolteS.listFiles();
        for(int i=0;i<czerwone.length;i++)
        {
            CzerwoneB[i] = BitmapFactory.decodeFile(czerwone[i].getAbsolutePath());
        }

        a.add(CzerwoneB[10]);
        a.add(CzerwoneB[10]);
        a.add(CzerwoneB[11]);
        a.add(CzerwoneB[10]);
        index=0;
        Call_list("65.3", 2);
        for(int i=0;i<8;i++) {
            if (wl[i] == true) {
                bitmapC[index] = combineImageIntoOne(a);
                index++;
            }
        }
//--------------------------lista
        List_new adapter_listy = new List_new(this ,Ceny, bitmapTRUE, bitmapC);
        lista.setAdapter(adapter_listy);

    }
    
    public void Call_list(String wart,int poz)
    {   a.clear();
        Character  ch1 = wart.charAt(0);
        Character  ch2 = wart.charAt(1);
        Character  ch3 = wart.charAt(2);
        Character  ch4 = wart.charAt(3);
        if (ch1 == '.') { a.add(CzerwoneB[11]);}
        else {a.add(CzerwoneB[  Character.getNumericValue(ch1)]);}
        if (ch2 == '.') { a.add(CzerwoneB[11]);}
        else {a.add(CzerwoneB[  Character.getNumericValue(ch2)]);}
        if (ch3 == '.') { a.add(CzerwoneB[11]);}
        else {a.add(CzerwoneB[ Character.getNumericValue(ch3)]);}
        if (ch4 == '.') { a.add(CzerwoneB[11]);}
        else {a.add(CzerwoneB[  Character.getNumericValue(ch4)]);}
        Log.v("odebrane",wart + " "+poz+"  "+ ch4 );

       bitmapC[poz] = combineImageIntoOne(a);
        List_new adapter_listy = new List_new(this ,Ceny, bitmapTRUE, bitmapC);
        lista.setAdapter(adapter_listy);
        combineImageIntoOne(a);
    }
    //---------------------scalanie obrazkow
    public Bitmap combineImageIntoOne(ArrayList<Bitmap> bitmap) {
        int w=32,  h = 16;
        int right = 0;
        Log.v("ilosc bmp "," " +bitmap.size());
        Bitmap temp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(temp);
        if(bitmap.size() == 4)
        for (int i = 0; i < bitmap.size(); i++) {
            canvas.drawBitmap(bitmap.get(i), right,  0f, null);
            if (bitmap.get(i).getWidth()>5)
                right += bitmap.get(i).getWidth()+1;
            else
                right += bitmap.get(i).getWidth();
           Log.v("dl bmp ", " " + bitmap.get(i).getWidth());
        }
        return temp;
    }
    
}

Prawdopodobnie problemy są 2
1 nie zlokalizowałem / ale dane odebrane z TextWatchera z poza głównej klasy nie pozwalają nic robić w głównej. a może to wina definicji głównej klasy zawarta w tej od adaptera ?
2 możliwe że sypie się dlatego że odbieram dane z adaptera listy i na ich podstawie wstawiam nowy adapter / ale nie znam dokładnej przyczyny ?

1

No ale jak jest crash to jest LogCat. Pokaż która linijka i co mówi. A nie że może jest NPE

0

Wskazuje na linijki gdzie przelatują dane między klasami i składanie obrazków
z tym że te dane nie są null ! sprawdzę to jeszcze raz

 05-05 21:34:53.061  11995-11995/pl.xtronic.www.pylondroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at android.graphics.Canvas.throwIfRecycled(Canvas.java:1025)
            at android.graphics.Canvas.drawBitmap(Canvas.java:1065)
            at pl.xtronic.www.pylondroid.Galeria.combineImageIntoOne(Galeria.java:159)
            at pl.xtronic.www.pylondroid.Galeria.Call_list(Galeria.java:145)
            at pl.xtronic.www.pylondroid.List_new$1.afterTextChanged(List_new.java:93)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7095)
            at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8743)
            at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
            at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
            at android.widget.TextView.doKeyDown(TextView.java:5240)
            at android.widget.TextView.onKeyDown(TextView.java:5059)
            at android.view.KeyEvent.dispatch(KeyEvent.java:2609)
            at android.view.View.dispatchKeyEvent(View.java:7086)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
            at android.widget.ListView.dispatchKeyEvent(ListView.java:2026)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1892)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1369)
            at android.app.Activity.dispatchKeyEvent(Activity.java:2356)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1819)
            at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3575)
            at android.view.ViewRootImpl.deliverKeyEvent(ViewRootImpl.java:3531)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3113)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4153)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4132)
            at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2930)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

a jednak CzerwoneB null - teraz tylko dojść why?

0

Czy wywołując jakąś metodę z poziomu innej klasy w ten sposób

ActivityMain _main = new ActivityMain ()
_main.metoda() 

zmienne wypełniane w onCreate klasy main pozostają puste ?

0
Prim0 napisał(a):

Czy wywołując jakąś metodę z poziomu innej klasy w ten sposób

ActivityMain _main = new ActivityMain ()
_main.metoda() 

zmienne wypełniane w onCreate klasy main pozostają puste ?

No raczej, tworzeniem aktywności i zarządzaniem ich cyklem życia zajmuje się system..

0

W takim razie jak odbierać stringi z takiego Edit box gdzieś z "wewnętrznej" klasy czy przekazywanie jakiegoś parametru parent rozwiąże problem ?

0

albo przekaż String przy tworzeniu tej klasy, albo jakiś interfejs, albo do Bundla....

0

Racja przekazać by się dało bo position łapię
problem tylko w tym że zdarzenie wywołujące jest w TextWatcher po stronie klasy podrzędnej bo chodzi o tekst wpisany w EditText
kombinuje jak by tego TextWatchera do głównej activity przenieść tylko nie mogę EditTexta namierzyć
testowy2= (EditText)lista.getChildAt(wantedChild).findViewById(R.id.editText); NULL

a najlepsze jest to

List_new adapter_listy = new List_new(this ,Ceny, bitmapTRUE, bitmapC);
        lista.setAdapter(adapter_listy); 

i lista.getChildCount() = 0 WTF

2

ło boziu.

Weź najpierw poczytaj o konwencji nazw w Java, później trochę o clean code , i bierz się wtedy za robienie List View

Generalnie to nie bardzo wiem co chcesz zrobić bo przekopanie się przez Twój kod to jakieś mission impossible.

Napisz dokładnie co chcesz osiągnąć.

Bo rozumiem że chcesz napisać tak żeby TextWatcher zwracał Ci jakieś wartości do Activity jak coś tam się wpisze w dany EditText tak? ( juz sam pomysł wrzucania EditText do ListView dziwny ale co tam)

to robisz tak

W adapterze tworzysz interfejs np.

public interface OnTextChange{

void onTextChanged(int position,String text);
}

i robisz tak żeby Twoje activity implementowało ten interface

Następnie w konstruktorze Adaptera robisz takie cudo:

private OnTextChange textChangeListener;
 public List_new (Context ctx, String[] wlac, Bitmap[] bmp, Bitmap[] Cbmp) {
        super();
        this.wla=wlac;
        this.mctx = ctx;
        this.bmps = bmp;
        this.bmpC = Cbmp;
        this.textChangeListener=(OnTextChange)ctx;
 }

i dodajesz do swojego TextWatchera

@Override
            public void afterTextChanged(Editable editable) {
 
                if(editable.toString().length()==4)
                {
                    //   addExpenseModel.setAmount(editable.toString());
                    textChangeListener.onTextChanged(position,editable.toString());
                    Call_list(editable.toString(), 2);}

nie mam pojęcia co robi Twój kod i boje się zapytać ale w ten sposób będziesz miał wyciągnięte do Activity zarówno tekst jak i numer pola z którego został wywołany TextWatcher.

pzdr
Wojtek

0

Dzięki
już objaśniam
adapter ma 2 ImageView i 1 edittext
po wklepaniu tekstu dostaje z listy tekst i nr adaptera na podstawie tekstu generuję bitmapke i podmieniam jedną z 2 w adapterze o tym samym numerze

|BMPNAZWA| |EDITTEXT| |BMPTEXT|

po wklepaniu 4 cyferek buduje BMPTEXT i umieszczam pod tą samą pozycją z której dostałem stringa

Dlaczego EditTex na listView ... ilość pozycji jest zmienna może ich być 1 lub 2 albo 100 a ListView pozwala na eleganckie dynamiczne tworzenie tablic komponentów

0

to po co w ogóle to chcesz robić w activity?
zrób to w listenerze i tyle

0

Wybacz nie dokończyłem.
obok listy jest button. - jak już wszystko jest jak należy aktivity generują plik binarny z bitmapek - > z pliku kilka ramek i pozyła je po udp do innego urządzenia

0

No ale to Activity ma dostęp do wszystkiego bo naciśnięciu buttona . a to co się ma dziać w środku to co to ją obchodzi.

Z activity masz dostęp do adaptera, który z kolei ma dostęp do Edit textów itp.

Nie wiem gdzie masz problem ciągle.

a jezeli chodzi o Twoje wyjaśnienie dotyczące edit text na list view no to właśnie kto Ci będzie do 100 pól coś wpisywał?

0

a jezeli chodzi o Twoje wyjaśnienie dotyczące edit text na list view no to właśnie kto Ci będzie do 100 pól coś wpisywał?

niestety znam takiego ...

0

Rozumiem że troszkę było namieszane ale to tylko przez wielokrotne eksperymenty ...

Jeszcze tylko jedno pytanko .

TextWatcher zostawić w adapterze w getView() czy próbować łapać id od EditText z activity?

1 użytkowników online, w tym zalogowanych: 0, gości: 1