Java – Android: How to use a list of string arrays in a list line

Android: How to use a list of string arrays in a list line… here is a solution to the problem.

Android: How to use a list of string arrays in a list line

I’m struggling with my custom ListView. I want to populate my ListView with a custom row.xml file containing five TextViews. I have a text file mytextfile.txt in the raw folder. It looks like this :

SUN-9-JULY-On Sale Now-New York, Time Square
SAT-15-JULY-On Sale Now-London, National Gallery
MON-23-JULY-On Sale Now-Paris, The Eiffel Tower
 More lines here...

As you can see, I created an array of strings from each line (using the split method with “-“) and put all the string arrays into an ArrayList. I don’t know how to create my CustomAdapter class to do this. My other files look like….

Concert .java

public class Concerts {

private List<String[]> mAllConcerts;

public List<String[]> getAllConcerts() {
        return mAllConcerts;
    }

public Concerts() {
        mAllConcerts = new ArrayList<>();
        InputStream inputStream = null;
        InputStreamReader inputReader = null;
        BufferedReader bufferedReader;
        String line;
        try {
            inputStream = MainActivity.getGlobalContext().getResources()
                    .openRawResource(R.raw.mytextfile.txt);
            inputReader = new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(inputReader);
            while (( line = bufferedReader.readLine()) != null) {
                String [] mConcertDetails = line.split("-");
                mAllConcerts.add(mConcertDetails);
            }
        }
        catch (IOException e) {
             cathing...
        }
        finally {
              closing...
        }
    }
}

CustomAdapter .java (I don’t even know if I’m on the right path here).

public class CustomAdapter extends ArrayAdapter<String> {

TextView concertDayName;
    TextView concertDayNumber;
    TextView concertMonthName;
    TextView concertOnSaleNow;
    TextView concertPlaceName;

Concerts concerts;

public CustomAdapter(Context context, String[] values) {
        super(context, R.layout.concert_row, values);
    }

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        View view = inflater.inflate(R.layout.concert_row, parent, false);

concerts = new Concerts();

concertDayName = (TextView) view.findViewById(R.id.concert_day_name);
        concertDayNumber = (TextView) view.findViewById(R.id.concert_day_number);
        concertMonthName = (TextView) view.findViewById(R.id.concert_month_name);
        concertOnSaleNow = (TextView) view.findViewById(R.id.concert_on_sale_now);
        concertPlaceName = (TextView) view.findViewById(R.id.concert_place_name);

for(int i = 0; i < concerts.getAllConcerts().size(); i++) {
            String[] concertRow = concerts.getAllConcerts().get(i);
            concertDayName.setText(concertRow[0]);
            concertDayNumber.setText(concertRow[1]);
            concertMonthName.setText(concertRow[2]);
            concertOnSaleNow.setText(concertRow[3]);
            concertPlaceName.setText(concertRow[4]);
        }
        return view;
    }
}

MenuConcerts.java (this is the fragment that will display the list

).

public class MenuConcerts extends Fragment {

String[] concertDetails;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.concerts_layout, container, false);

((MainActivity) getActivity()).setActionBarTitle(getString(R.string.title_spelningar));

ListAdapter listAdapter = new CustomerAdapter(getActivity(), concertDetails);

return view;
    }
}

Solution

I recommend that you create a CustomAdapter: using the object’s ArrayList instead of an array of strings

Public Class Concert {
private String dayName;
private String dayNumber;
 constructors, getter and setters
}

So you just have to do:

   public class CustomAdapterextends BaseAdapter {

Context context;

protected List<Concert> listConcert;
LayoutInflater inflater;

public ListCarsAdapter(Context context, List<Concert> listConcert) {
    this.listConcert= listConcert;
    this.inflater = LayoutInflater.from(context);
    this.context = context;
}

public int getCount() {
    return listConcert.size();
}

public Concert getItem(int position) {
    return listConcert.get(position);
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {

holder = new ViewHolder();
        convertView = this.inflater.inflate(R.layout.concert_row,parent, false);

holder.concertDayName = (TextView) convertView
                .findViewById(R.id.concert_day_name);
        holder.concertDayNumber= (TextView) convertView
                .findViewById(R.id.concert_day_number);
        holder.concertMonthName = (TextView) convertView
                .findViewById(R.id.concert_month_name);
        holder.concertOnSaleNow = (TextView) convertView
                .findViewById(R.id.concert_on_sale_now);
        holder.concertPlaceName = (TextView) convertView
                .findViewById(R.id.concert_place_name);

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

Concert concert = listConcert.get(position);
    holder.concertDayName .setText(concert.getDayName());
    holder.concertDayNumber.setText(concert.getDayNumber());
    etc.
    return convertView;
}

private class ViewHolder {
    TextView concertDayName;
    TextView concertDayNumber;
    Textview concertMonthName;
    Textview concertOnSaleNow;
    Textview concertPlaceName;
}

}

and your activity:

public class MenuConcerts extends Fragment {

ArrayList<Concert> arrayConcert = new ArrayList<Concert>();

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.concerts_layout, container, false);

((MainActivity) getActivity()).setActionBarTitle(getString(R.string.title_spelningar));
  all the reading file logic here;
        ListAdapter listAdapter = new CustomerAdapter(getActivity(), arrayConcert);

return view;
    }
}

Related Problems and Solutions