Zmiana wyglądu klikniętego elementu listView

0

Stworzyłem listview ze swoim layoutem i własnym adapterem rozszerzającym ArrayAdapter. Tylko teraz nie mogę dojsć jak zmienić wygląd jednego elementu gdy zostanie kliknięty/wybrany.

W onItemClick napisałe cos takiego:

MYList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


                makeToast("Kliknięty: " + position);
                adapter.getItem(position).wybieram();

//        adapter.notifyDataSetChanged();
                MYList.setAdapter(adapter);
            }
        });

Niby mi po kliknięciu zaznacza kliknięty element. Jednak jak kliknę np. 2 element(zostanie mu ustawiony inny layout z innym kolorem tła) i przeciągnę listę w dół to tam też jest element podświetlony. A gdy przeciągam listę znów do góry to tam jest inny element podświetlony niż kliknąłem.

Kod MainActivity.

public class MainActivity extends Activity {

    private ListView MYList;
    private MYBean ListMY[];
    private MYAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListMY = new MYBean[]{
new MYBean("Warka", "Na stanie: 5"),
                new MYBean("COS1", "parametr: 1"),
                new MYBean("COS2", "parametr: 2"),
                new MYBean("COS3", "parametr: 1"),
                new MYBean("COS4", "parametr: 3"),

                 new MYBean("COS1", "parametr: 1"),
                new MYBean("COS2", "parametr: 2"),
                new MYBean("COS3", "parametr: 1"),
                new MYBean("COS4", "parametr: 3"),
               new MYBean("COS1", "parametr: 1"),
                new MYBean("COS2", "parametr: 2"),
                new MYBean("COS3", "parametr: 1"),
                new MYBean("COS4", "parametr: 3"),
                new MYBean("COS1", "parametr: 1"),
                new MYBean("COS2", "parametr: 2"),
                new MYBean("COS3", "parametr: 1"),
                new MYBean("COS4", "parametr: 3"),
                new MYBean("COS1", "parametr: 1"),
                new MYBean("COS2", "parametr: 2"),
                new MYBean("COS3", "parametr: 1"),
                new MYBean("COS4", "parametr: 3"),
 };
//ListMY[5].wybieram();
        adapter = new MYAdapter(this,
                R.layout.mylist_item_view_custom_list, ListMY);

        MYList = (ListView) findViewById(R.id.BearListView);
        MYList.setAdapter(adapter);



        MYList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


                makeToast("Kliknięty: " + position);
                adapter.getItem(position).wybieram();

//        adapter.notifyDataSetChanged();
                MYList.setAdapter(adapter);
            }
        });
    }
   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void makeToast(String s){
        Toast t = Toast.makeText(this, s, Toast.LENGTH_LONG);
        t.show();
    }
    
}

a w klasie adaptera:




public class MYAdapter extends ArrayAdapter<MYBean> {

    Context ctx;
    int layoutResourceId;
    MYBean dane[] = null;

    public MYAdapter(Context ctx, int layoutResourceId, MYBean[] dane){
        super(ctx, layoutResourceId, dane);
        this.layoutResourceId = layoutResourceId;
        this.ctx = ctx;
        this.dane = dane;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        MYBean obiekt = dane[position];
        View wiersz = convertView;
        uchwytWiersza uchwyt = null;
        if(wiersz == null){

            LayoutInflater inflanter = ((Activity)ctx).getLayoutInflater();
            wiersz = inflanter.inflate(layoutResourceId, parent, false);
            if(obiekt.wybrany){

                wiersz = inflanter.inflate(R.layout.mylist_item_view_custom_list2, parent, false);
            }


            uchwyt = new uchwytWiersza();
            uchwyt.MainMYView = (TextView)wiersz.findViewById(R.id.MainMYView);
            uchwyt.isMYView = (TextView)wiersz.findViewById(R.id.isMYView);

            wiersz.setTag(uchwyt);
        }
        else{
            uchwyt = (uchwytWiersza)wiersz.getTag();
        }

//        MYBean obiekt = dane[position];
        uchwyt.MainMYView.setText(obiekt.MYName);
        uchwyt.isMYView.setText(obiekt.MYIs);

        return wiersz;
    }

    static class uchwytWiersza{
        TextView MainMYView;
        TextView isMYView;
        boolean wybrany;
    }
}


Klasa MYBean:

public class MYBean {

    public String MYName;
    public String MYIs;
    public boolean wybrany=false;

    public MYBean(){

    }

    public MYBean(String MYName, String MYIs){
        this.MYName = MYName;
        this.MYIs = MYIs;

    }

    public void wybieram(){
        wybrany=true;
    }
}
0

Zmień nazwy zmiennych na angielskie i zgodne z podstawowymi zasadami programowania w Javie (DUŻA litera dla nazwy klasy), a następnie sformatuj kod (ctrl+shift+f w eclipse i ctrl+alt+l w android studio). Wklej poprawiony kod, a może będę w stanie Ci pomóc.

0

Poprawiłem kod wg. twoich sugestii. Jednak po wciśnięciu ctrl+alt+l formatowanie dużo się nie zmieniło.

Plik MainActivity.java

package example.mylistmanager;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private ListView myList;
    private MyBean listMyBean_data[];
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listMyBean_data = new MyBean[]{
                new MyBean("Cos1", "parametr: 1"),
                new MyBean("Cos2", "parametr: 2"),
                new MyBean("Cos3", "parametr: 1"),
                new MyBean("Cos4", "parametr: 3"),
                new MyBean("Cos5", "parametr: 7"),

                new MyBean("Cos1", "parametr: 1"),
                new MyBean("Cos2", "parametr: 2"),
                new MyBean("Cos3", "parametr: 1"),
                new MyBean("Cos4", "parametr: 3"),
                new MyBean("Cos5", "parametr: 7"),
                new MyBean("Cos1", "parametr: 1"),
                new MyBean("Cos2", "parametr: 2"),
                new MyBean("Cos3", "parametr: 1"),
                new MyBean("Cos4", "parametr: 3"),
                new MyBean("Cos5", "parametr: 7"),
                new MyBean("Cos1", "parametr: 1"),
                new MyBean("Cos2", "parametr: 2"),
                new MyBean("Cos3", "parametr: 1"),
                new MyBean("Cos4", "parametr: 3"),
                new MyBean("Cos5", "parametr: 7"),


        };
//listMyBean_data[5].select();
        adapter = new MyAdapter(this,
                R.layout.mylist_item_view_custom_list, listMyBean_data);

        myList = (ListView) findViewById(R.id.MyListView);
        myList.setAdapter(adapter);


        myList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

//                nowaaktywnosc();
                makeToast("Kliknięty: " + position);
                adapter.getItem(position).select();
                //listMyBean_data[position].select();
//        adapter.notifyDataSetChanged();
                myList.setAdapter(adapter);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void makeToast(String s) {
        Toast t = Toast.makeText(this, s, Toast.LENGTH_LONG);
        t.show();
    }

}


Plik MyBean.java

package example.mylistmanager;

public class MyBean {

    public String title;
    public String itemProperty;
    public boolean selected = false;

    public MyBean() {
    }

    public MyBean(String title, String itemProperty) {
        this.title = title;
        this.itemProperty = itemProperty;
    }

    public void select() {
        selected = true;
    }
}

Plik MyAdapter.java

package example.mylistmanager;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;


public class MyAdapter extends ArrayAdapter<MyBean> {

    Context ctx;
    int layoutResourceId;
    MyBean data[] = null;

    public MyAdapter(Context ctx, int layoutResourceId, MyBean[] data) {
        super(ctx, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.ctx = ctx;
        this.data = data;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyBean object = data[position];
        View row = convertView;
        MyBeanHolder holder = null;
        if (row == null) {

            LayoutInflater inflanter = ((Activity) ctx).getLayoutInflater();
            row = inflanter.inflate(layoutResourceId, parent, false);
            if (object.selected) {

                row = inflanter.inflate(R.layout.mylist_item_view_custom_list2, parent, false);
            }


            holder = new MyBeanHolder();
            holder.title = (TextView) row.findViewById(R.id.MainMYView);
            holder.itemProperty = (TextView) row.findViewById(R.id.isMYView);

            row.setTag(holder);
        } else {
            holder = (MyBeanHolder) row.getTag();
        }

//        MyBean object = data[position];
        holder.title.setText(object.title);
        holder.itemProperty.setText(object.itemProperty);

        return row;
    }

    static class MyBeanHolder {
        TextView title;
        TextView itemProperty;
        boolean selected;
    }
}

0

W OnItemClickListener usuń linijkę setadapter (nie ma to sensu, za każdym kliknięciem ustawiasz adapter od nowa). Problem, o którym piszesz wynika z tego, że nie zaimplementowałeś metod getItemViewType i getViewTypeCount. To musisz dodać/zmienić w adapterze:

 public static final int NORMAL_ITEM = 0; // tutaj jest bardzo ważne żeby liczby określające typy widoków zaczynały się od 0 i kończyły na (getviewTypeCount - 1)
        public static final int SELECTED_ITEM = 1;
        
        @Override
        public int getItemViewType(int position) {
            boolean selected = getItem(position).selected;
            return selected ? SELECTED_ITEM : NORMAL_ITEM;
        }


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

            MyBean object = data[position];
            View row = convertView;
            MyBeanHolder holder = null;
            if (row == null) {

                LayoutInflater inflanter = ((Activity) ctx).getLayoutInflater(); // nie twórz za każdym razem layoutinflatera, stwórz raz  w kontruktorze za pomocą LayoutInflater.from(context)

                //tutaj masz błąd
//                row = inflanter.inflate(layoutResourceId, parent, false);
//                if (object.selected) {
//
//                    row = inflanter.inflate(R.layout.mylist_item_view_custom_list2, parent, false);
//                }

                getItemViewType(position) {
                    case NORMAL_ITEM:
                        row = inflanter.inflate(layoutResourceId, parent, false);
                        break;
                    
                    case SELECTED_ITEM:
                        row = inflanter.inflate(R.layout.mylist_item_view_custom_list2, parent, false);
                        break;
                }
                

                holder = new MyBeanHolder();
                holder.title = (TextView) row.findViewById(R.id.MainMYView);
                holder.itemProperty = (TextView) row.findViewById(R.id.isMYView);

                row.setTag(holder);
            } else {
                holder = (MyBeanHolder) row.getTag();
            }

            holder.title.setText(object.title);
            holder.itemProperty.setText(object.itemProperty);

            return row;
        }

        @Override
        public int getViewTypeCount() {
            return 2; //dlatego ze uzywasz dwoch roznych plikow xml z layoutem
        }

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