Search code examples
androidlistviewandroid-arrayadapterandroid-adaptercustom-adapter

ListView Custom ArrayAdapter - Changes textbutton from Button OnClickListener


I want to change textbutton on button onclicklistener but for every 5 row textbutton display same result. I just want change text button for 1 button clicked

xml layout childview

<Button
    android:id="@+id/btn_seatmap"
    style="@style/buttonSeatMap"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txt_kereta_tiba"
    android:layout_toRightOf="@+id/txt_info_seat"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:text="@string/btn_seatmap" />    

xml layout listview

    <ListView
    android:id="@+id/list_kereta"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/btn_pilih_jadwal"
    android:layout_below="@+id/txt_title_jadwal_kai"
    android:layout_marginBottom="10dp"
    android:background="@android:color/white"
    android:choiceMode="singleChoice"
    android:dividerHeight="1dp"
    android:focusable="true"
    android:scrollbars="none" />       

and here code from custom adapter

@Override
public View getView(final int arg0, View arg1, ViewGroup arg2) {
    View view = arg1;
    ListHolder listHolder = null;

    if (view == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        view = inflater.inflate(layoutResourceId, arg2, false);

        listHolder = new ListHolder();
        listHolder.layout = (RelativeLayout) view
                .findViewById(R.id.layout_jadwal_kai);
        listHolder.txtNama = (TextView) view
                .findViewById(R.id.txt_nama_kereta);
        listHolder.txtBerangkat = (TextView) view
                .findViewById(R.id.txt_kereta_brkt);
        listHolder.txtHarga = (TextView) view
                .findViewById(R.id.txt_harga_kereta);
        listHolder.txtTiba = (TextView) view
                .findViewById(R.id.txt_kereta_tiba);
        listHolder.txtClass = (TextView) view
                .findViewById(R.id.txt_kelas_kereta);
        listHolder.txtSeat = (TextView) view
                .findViewById(R.id.txt_info_seat);
        listHolder.btnSeatMap = (Button) view
                .findViewById(R.id.btn_seatmap);
        CheckSeatOnProgress = false;
        view.setTag(listHolder);
    } else {
        listHolder = (ListHolder) view.getTag();
    }
        listHolder.btnSeatMap.setTag(listHolder);
        listHolder.btnSeatMap.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ListHolder holder = (ListHolder) v.getTag();
                holder.btnSeatMap.setText("TEST");

                // listHolder.btnSeatMap.setText("TEST");
            });

adapter code

public void refreshListJadwal() {
    adapter = new AdapterListKereta(getActivity(),
            R.layout.custom_list_jadwalkai, setGetJadwals, dataJadwalKereta);
    listKereta.setAdapter(adapter);
}

"TEST" display for every 5 row. please help. thank you


Solution

  • I found a work around, Not an optimal solution though :D try this,

    private HashMap<Integer, String> selected = new HashMap<Integer, String>();
    
    @Override
        public View getView(final int position, @Nullable View arg1, @NonNull ViewGroup parent) {
    
            View view = arg1;
            ListHolder listHolder = null;
    
            if (view == null) {
                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                view = inflater.inflate(R.layout.list_item, parent, false);
    
                listHolder = new ListHolder();
                listHolder.nameTextView = (TextView) view.findViewById(R.id.listitem1);
                listHolder.btnSeatMap = (Button) view.findViewById(R.id.listbtn1);
                view.setTag(listHolder);
            } else {
                listHolder = (ListHolder) view.getTag();
    
            }
    
            if(selected != null && !selected.isEmpty() && selected.get(position) != null )
                listHolder.btnSeatMap.setText("TEST");
            else {
                listHolder.btnSeatMap.setText("");
            }
    
            listHolder.btnSeatMap.setTag(position);
            listHolder.nameTextView.setText(itemsArrayList[position]);
            listHolder.btnSeatMap.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    int which = -1;
                    Object obj = v.getTag();
                    if (obj instanceof Integer)
                    {
                        which = (Integer) obj;
                    }
                    Log.e("POSISITON", which+"");
                    selected.put(which, "TEST");
                    notifyDataSetChanged();
                }});
    
            return view;
        }