Skip to content Skip to sidebar Skip to footer

Add A Button To A ListView For Each Element

I am creating a shopping cart app and I am trying to populate a String[] Product which is called items. Each item has an ID a Name and a Price. The issue I am having is that I am t

Solution 1:

Change line:

final ListAdapter theAdapter = new ArrayAdapter<>(this,
        android.R.layout.simple_list_item_checked, items);

to:

final ListAdapter theAdapter = new ArrayAdapter<>(this,
           R.layout.row_layout , R.id.textview1, items);

You use wrong ArrayAdapter constructor :) If root view is not a TextView (in your case root view is LinearLayout) you have to pass TextView id       


Solution 2:

You need to implement a ProductsAdapter. The ArrayAdapter constructor you are using is trying to set a list of only check item layouts which is invalid given your product. You will have to create a simple adapter which maps each variable in the Product object to the row_layout.xml.

You can model your adapter after this - https://github.com/ucsunil/receipts/blob/master/app/src/main/java/com/amex/receipts/adapters/ItemsAdapter.java. It is from a practice project I did sometime back which was to add items to a cart. You basically will override the getView() method to bind your views.


Solution 3:

I would create a custom adapter class, and within that adapter class have a callback. You can modify this code to take a String[] or ArrayList and also use your XML Layout.

This sample code is somewhat overkill, but it is the best I could do for providing an example right now.

public class WorkoutCardsAdapter extends ArrayAdapter<WorkoutView> {

private LayoutInflater mInflater;
String TAG = WorkoutCardsAdapter.class.getCanonicalName();
Callback mCallback;
List<WorkoutView> mViews;

public WorkoutCardsAdapter(Context context, List<WorkoutView> views, Callback callback) {
    super(context, 0, views);
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mCallback = callback;
    this.mViews = views;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    WorkoutView workoutView = getItem(position);
    convertView = null;


    if (convertView == null) {
        holder = new ViewHolder();
        if (workoutView.getWorkoutMainCategory().equals("Traditional")) {
            if (workoutView.getWorkoutType().equals("Strength")) {
                if (workoutView.getWorkoutCategory().equals("Weightlifting")) {
                    convertView = mInflater.inflate(R.layout.single_workout_layout_traditional_weights, parent, false);
                    holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                    holder.tvWorkoutCategory = (TextView) convertView.findViewById(R.id.textViewWorkoutCategoryItem);
                    holder.tvSetsItem = (TextView) convertView.findViewById(R.id.textViewSetsItem);
                    holder.tvRepsItem = (TextView) convertView.findViewById(R.id.textViewRepsItem);
                    holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                    holder.tvWorkoutWeight = (TextView) convertView.findViewById(R.id.textViewWorkoutWeightItem);
                    holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
                    convertView.setTag(holder);
                } else if (workoutView.getWorkoutCategory().equals("Isometric") || workoutView.getWorkoutCategory().equals("Circuit") ||
                        workoutView.getWorkoutCategory().equals("Other")) {
                    convertView = mInflater.inflate(R.layout.single_workout_layout_traditional_strength, parent, false);
                    holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                    holder.tvWorkoutCategory = (TextView) convertView.findViewById(R.id.textViewWorkoutCategoryItem);
                    holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                    holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                    holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
                    convertView.setTag(holder);
                }
            } else if (workoutView.getWorkoutType().equals("Endurance")){
                if(workoutView.getWorkoutCategory().equals("Running")){
                    convertView = mInflater.inflate(R.layout.single_workout_layout_traditional_endurance, parent, false);
                    holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                    holder.tvWorkoutCategory = (TextView) convertView.findViewById(R.id.textViewWorkoutCategoryItem);
                    holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                    holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                    holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);

                } else if (workoutView.getWorkoutCategory().equals("Other")){
                   convertView = mInflater.inflate(R.layout.single_workout_layout_traditional_endurance, parent, false);
                    holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                    holder.tvWorkoutCategory = (TextView) convertView.findViewById(R.id.textViewWorkoutCategoryItem);
                    holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                    holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                    holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
                }
            } else if (workoutView.getWorkoutType().equals("Other")){
                convertView = mInflater.inflate(R.layout.single_workout_layout_traditional_other, parent, false);
                holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
            }
        } else if (workoutView.getWorkoutMainCategory().equals("CrossFit")) {
            //TODO: DEFINE CROSSFIT
            if(workoutView.getWorkoutType().equals("For Reps & Time")){
                convertView = mInflater.inflate(R.layout.single_workout_layout_crossfit_repstime, parent, false);
                holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                holder.tvSetsItem = (TextView) convertView.findViewById(R.id.textViewSetsItem);
                holder.tvRepsItem = (TextView) convertView.findViewById(R.id.textViewRepsItem);
                holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
            } else if (workoutView.getWorkoutType().equals("For Reps")){
                convertView = mInflater.inflate(R.layout.single_workout_layout_crossfit_reps, parent, false);
                holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                holder.tvSetsItem = (TextView) convertView.findViewById(R.id.textViewSetsItem);
                holder.tvRepsItem = (TextView) convertView.findViewById(R.id.textViewRepsItem);
                holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);

            } else if (workoutView.getWorkoutType().equals("For Time")){
                convertView = mInflater.inflate(R.layout.single_workout_layout_crossfit_time, parent, false);
                holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                holder.tvSetsItem = (TextView) convertView.findViewById(R.id.textViewSetsItem);
                holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
            } else if (workoutView.getWorkoutType().equals("For Weight")){
                convertView = mInflater.inflate(R.layout.single_workout_layout_crossfit_weight, parent, false);
                holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                holder.tvSetsItem = (TextView) convertView.findViewById(R.id.textViewSetsItem);
                holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
            } else if (workoutView.getWorkoutType().equals("Other")){
                convertView = mInflater.inflate(R.layout.single_workout_layout_traditional_other, parent, false);
                holder.tvWorkoutType = (TextView) convertView.findViewById(R.id.textViewWorkoutTypeItem);
                holder.tvWorkoutName = (TextView) convertView.findViewById(R.id.textViewWorkoutName);
                holder.tvDescription = (TextView) convertView.findViewById(R.id.textViewWorkoutDescriptionItem);
                holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
            }

        }
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    if (workoutView.getWorkoutMainCategory().equals("Traditional")) {
        if (workoutView.getWorkoutType().equals("Strength")) {
            if (workoutView.getWorkoutCategory().equals("Weightlifting")) {
                holder.tvWorkoutName.setText(workoutView.getWorkoutName());
                holder.tvWorkoutType.setText(workoutView.getWorkoutType());
                holder.tvWorkoutCategory.setText(workoutView.getWorkoutCategory());
                holder.tvWorkoutWeight.setText(workoutView.getWorkoutWeight());
                holder.tvSetsItem.setText(workoutView.getSets());
                holder.tvRepsItem.setText(workoutView.getReps());
            } else if (workoutView.getWorkoutCategory().equals("Isometric") || workoutView.getWorkoutCategory().equals("Circuit") ||
                    workoutView.getWorkoutCategory().equals("Other")) {
                holder.tvWorkoutName.setText(workoutView.getWorkoutName());
                holder.tvWorkoutType.setText(workoutView.getWorkoutType());
                holder.tvWorkoutCategory.setText(workoutView.getWorkoutCategory());
                holder.tvDescription.setText(workoutView.getWorkoutDesc());
            }
        } else if (workoutView.getWorkoutType().equals("Endurance")){
            if(workoutView.getWorkoutCategory().equals("Running")){
                holder.tvWorkoutName.setText(workoutView.getWorkoutName());
                holder.tvWorkoutType.setText(workoutView.getWorkoutType());
                holder.tvWorkoutCategory.setText(workoutView.getWorkoutCategory());
                holder.tvDescription.setText(workoutView.getWorkoutDistance());
            } else if (workoutView.getWorkoutCategory().equals("Other")){
                holder.tvWorkoutName.setText(workoutView.getWorkoutName());
                holder.tvWorkoutType.setText(workoutView.getWorkoutType());
                holder.tvWorkoutCategory.setText(workoutView.getWorkoutCategory());
                holder.tvDescription.setText(workoutView.getWorkoutDesc());
            }
        } else if (workoutView.getWorkoutType().equals("Other")){
            holder.tvWorkoutName.setText(workoutView.getWorkoutName());
            holder.tvWorkoutType.setText(workoutView.getWorkoutType());
            holder.tvDescription.setText(workoutView.getWorkoutDesc());
        }
    } else if (workoutView.getWorkoutMainCategory().equals("CrossFit")) {
        //TODO: DEFINE CROSSFIT
        if(workoutView.getWorkoutType().equals("For Reps & Time")){
            holder.tvWorkoutName.setText(workoutView.getWorkoutName());
            holder.tvWorkoutType.setText(workoutView.getWorkoutType());
            holder.tvSetsItem.setText(workoutView.getWorkoutTime());
            holder.tvRepsItem.setText(workoutView.getReps());
            holder.tvDescription.setText(workoutView.getWorkoutDesc());
        } else if (workoutView.getWorkoutType().equals("For Reps")){
            holder.tvWorkoutName.setText(workoutView.getWorkoutName());
            holder.tvWorkoutType.setText(workoutView.getWorkoutType());
            holder.tvSetsItem.setText(workoutView.getSets());
            holder.tvRepsItem.setText(workoutView.getReps());
            holder.tvDescription.setText(workoutView.getWorkoutDesc());
        } else if (workoutView.getWorkoutType().equals("For Time")){
            holder.tvWorkoutName.setText(workoutView.getWorkoutName());
            holder.tvWorkoutType.setText(workoutView.getWorkoutType());
            holder.tvSetsItem.setText(workoutView.getWorkoutTime());
            holder.tvDescription.setText(workoutView.getWorkoutDesc());
        } else if (workoutView.getWorkoutType().equals("For Weight")){
            holder.tvWorkoutName.setText(workoutView.getWorkoutName());
            holder.tvWorkoutType.setText(workoutView.getWorkoutType());
            holder.tvSetsItem.setText(workoutView.getWorkoutWeight());
            holder.tvDescription.setText(workoutView.getWorkoutDesc());
        } else if (workoutView.getWorkoutType().equals("Other")){
            holder.tvWorkoutName.setText(workoutView.getWorkoutName());
            holder.tvWorkoutType.setText(workoutView.getWorkoutType());
            holder.tvDescription.setText(workoutView.getWorkoutDesc());
        }

    }

    holder.btnRemoveWorkout = (Button) convertView.findViewById(R.id.btnRemoveWorkout);
    holder.btnRemoveWorkout.setTag(position);
    holder.btnRemoveWorkout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = (Integer) v.getTag();
            mCallback.onPressed(position);
        }
    });
    return convertView;
}

@Override
public WorkoutView getItem(final int position) {
    return mViews.get(position);
}

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

public interface Callback {
    void onPressed(int pos);
}

private static class ViewHolder {
    public TextView tvDescription;
    public TextView tvWorkoutType;
    public TextView tvWorkoutCategory;
    public TextView tvWorkoutWeight;
    public TextView tvSetsItem;
    public TextView tvRepsItem;
    public TextView tvWorkoutName;
    public Button btnRemoveWorkout;
}
}

Solution 4:

Hi try Removing the support library import android.support.v7.app.ActionBarActivity;

And extend Activity not ActionBarActivity. I have tried it and it work fine. The support library has some problems.


Post a Comment for "Add A Button To A ListView For Each Element"