py9
py9

Reputation: 626

Selectable custom ListView

I have found several questions like these, and I do get that I should be using the setOnItemClickListener as:

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener(position) {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            String Value = listView.getItemAtPosition();
        }
    });

However, I am not able to get this working. Its a bit tricky since I am generating the listView dynamically from a JSON Array.

I am using Intent to pass the data as a string to DisplayListView class:

public class DisplayListView extends AppCompatActivity {
    String response;
    JSONObject jsonObject;
    JSONArray jsonArray;
    DrinksAdapter drinksAdapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.display_listview_layout);
        listView = (ListView) findViewById(R.id.listview);
        drinksAdapter = new DrinksAdapter(this,R.layout.row_layout);
        listView.setAdapter(drinksAdapter);
        response = getIntent().getExtras().getString("json_data");

        try {
            jsonObject = new JSONObject(response);
            jsonArray  = new JSONObject(response).getJSONArray("Menu");
            //jsonArray  = jsonObject.getJSONArray("Menu");
            int count = 0;
            String ime,kolicina,cijena;


            while(count < jsonArray.length()) {
                JSONObject JO = jsonArray.getJSONObject(count);
                ime = JO.getString("ime");
                kolicina = JO.getString("kolicina");
                cijena = JO.getString("cijena");

                Drinks drinks = new Drinks(ime,kolicina,cijena);
                drinksAdapter.add(drinks);

                count++;

            }


        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
}

In the above, Im looping through the array and initializing data by calling DrinksAdapter:

public class DrinksAdapter extends ArrayAdapter {
    List list = new ArrayList();

    public DrinksAdapter(@NonNull Context context, @LayoutRes int resource) {
        super(context, resource);
    }


    public void add(Drinks object) {
        super.add(object);
        list.add(object);
    }

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

    @Nullable
    @Override
    public Object getItem(int position) {

        return list.get(position);
    }

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

        View row;
        row = convertView;
        DrinkHolder drinkHolder;

        if(row == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.row_layout,parent,false);
            drinkHolder = new DrinkHolder();
            drinkHolder.tx_ime = (TextView) row.findViewById(R.id.tx_ime);
            drinkHolder.tx_kolicina = (TextView) row.findViewById(R.id.tx_kolicina);
            drinkHolder.tx_cijena = (TextView) row.findViewById(R.id.tx_cijena);

            row.setTag(drinkHolder);
        } else {
            drinkHolder = (DrinkHolder) row.getTag();
        }


        Drinks drinks = (Drinks) this.getItem(position);
        drinkHolder.tx_ime.setText(drinks.getIme());
        drinkHolder.tx_kolicina.setText(drinks.getKolicina());
        drinkHolder.tx_cijena.setText(drinks.getCijena());
        return row;

    }

    static class DrinkHolder {
        TextView tx_ime,tx_kolicina,tx_cijena;
    }

}

Drinks class is being used to initialize the variables.

Where can I implement this function?

I know I have a lot to learn and I am doing so every day, it looks like Im just a bit stuck at the moment :(

Any kind of help is highly appreciated. Thank you!

Upvotes: 0

Views: 49

Answers (2)

phpdroid
phpdroid

Reputation: 1663

u can activate a listener on certain elements in the view in getView method by

drinkHolder.tx_cijena .setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) { 
         //using value of `int position` in `getView` to know which item in the list is clicked
   }


Like this

public class DrinksAdapter extends ArrayAdapter {
List list = new ArrayList();

public DrinksAdapter(@NonNull Context context, @LayoutRes int resource) {
    super(context, resource);
}


public void add(Drinks object) {
    super.add(object);
    list.add(object);
}

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

@Nullable
@Override
public Object getItem(int position) {

    return list.get(position);
}

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

    View row;
    row = convertView;
    DrinkHolder drinkHolder;

    if(row == null) {
        LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = layoutInflater.inflate(R.layout.row_layout,parent,false);
        drinkHolder = new DrinkHolder();
        drinkHolder.tx_ime = (TextView) row.findViewById(R.id.tx_ime);
        drinkHolder.tx_kolicina = (TextView) row.findViewById(R.id.tx_kolicina);
        drinkHolder.tx_cijena = (TextView) row.findViewById(R.id.tx_cijena);

        row.setTag(drinkHolder);
    } else {
        drinkHolder = (DrinkHolder) row.getTag();
    }


    final Drinks drinks = (Drinks) this.getItem(position); //make it final
    drinkHolder.tx_ime.setText(drinks.getIme());
    drinkHolder.tx_kolicina.setText(drinks.getKolicina());
    drinkHolder.tx_cijena.setText(drinks.getCijena());
     drinkHolder.tx_ime.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
     //do anything with your **drink** object get any present value
    Log.i("INFO", drinks.getIme()); // you will log whichever text is clicked in Ime of each list item
     }
    }
    return row;

}

static class DrinkHolder {
    TextView tx_ime,tx_kolicina,tx_cijena;
}

}

Upvotes: 1

amacf
amacf

Reputation: 257

You should be able to just plop that listener into the onCreate method, attaching it to the ListView. Try something like this and let us know the results:

public class DisplayListView extends AppCompatActivity {
    String response;
    JSONObject jsonObject;
    JSONArray jsonArray;
    DrinksAdapter drinksAdapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.display_listview_layout);
        listView = (ListView) findViewById(R.id.listview);
        drinksAdapter = new DrinksAdapter(this,R.layout.row_layout);
        listView.setAdapter(drinksAdapter);
        response = getIntent().getExtras().getString("json_data");

        try {
            jsonObject = new JSONObject(response);
            jsonArray  = new JSONObject(response).getJSONArray("Menu");
            //jsonArray  = jsonObject.getJSONArray("Menu");
            int count = 0;
            String ime,kolicina,cijena;


            while(count < jsonArray.length()) {
                JSONObject JO = jsonArray.getJSONObject(count);
                ime = JO.getString("ime");
                kolicina = JO.getString("kolicina");
                cijena = JO.getString("cijena");

                Drinks drinks = new Drinks(ime,kolicina,cijena);
                drinksAdapter.add(drinks);

                count++;

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(position) {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Drink drink = adapterView.getItem(i);
            }
        });

    }
}

Upvotes: 0

Related Questions