Abushawish
Abushawish

Reputation: 1473

Set visibility for an image within a ListView row

Overview:

I have a ListView with a custom adapter/layout, every time a user adds a new row (which contains a number), I check if that number is the smallest in the list. If so, an image within that row must be set as visible while setting all other row's images as invisible.

Problem:

My ListView does not set any row's image as visible, even though I have the index of the smallest element.

How I'm doing it:

//In MainActivity

private void addProduct(float price) { //User adds product
    priceList.add(price); //Add to Float list
    adapter.notifyDataSetChanged();
    updateView(findMinIndex(priceList)); //Find smallest val indx
}

private void updateView(int index){

    View v = listView.getChildAt(index -
            listView.getFirstVisiblePosition());

    if(v == null)
        return;

    ImageView checkMark = (ImageView) v.findViewById(R.id.check_mark);
    checkMark.setVisibility(View.VISIBLE); //Initially set Invisible
}

Edit, CustomAdapter:

public CustomList(Activity context,
                      ArrayList<Float> priceList) {
    super(context, R.layout.list_single, priceList);
    this.context = context;
    priceList = priceList;
}

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

    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.list_single, null, true);
    TextView price = (TextView) rowView.findViewById(R.id.new_price);
    ImageView cheapest = (ImageView) rowView.findViewById(R.id.check_mark);

    price.setText(priceList.get(position) + "");

    return rowView;
}

Thank you

Upvotes: 0

Views: 263

Answers (3)

Abushawish
Abushawish

Reputation: 1473

I got it working :).

Problem is that adapter.notifyDataSetChanged(); is async, so while it's doing that, updateView(findMinIndex(priceList)); runs but doesn't find the new row as it should. Therefore, I add a runnable to the ListView object as so:

adapter.notifyDataSetChanged();
listView.post( new Runnable() {
    @Override
    public void run() {
        updateView(findMinIdx(priceList));
    }
});

Now it works perfectly!

Upvotes: 0

Rushi Ayyappa
Rushi Ayyappa

Reputation: 2848

try this way;

  • Create a Pojo class with imageview and it's state(Visibility) initially set all to invisible
  • Add your items to the ArrayList of Pojo Class type.
  • when user enters a new row based on your requirement set visibility state to true or false(visible or invisible) and call notifyDataSetChanged() to the adapter.
  • Doing this way you can have a easy track of the items.

Upvotes: 0

It is your priceList binded with the adapter? First of all i would put a breakpoint to see if you are getting the right view in the updateView method.

Upvotes: 1

Related Questions