2015-05-05 79 views
4

我正在努力与我的自定义列表视图。我想用我自定义的row.xml文件填充我的列表视图,其中包含五个文本视图。我在raw文件夹中有一个文本文件mytextfile.txt。它看起来像这样:Android:如何使用列表中的字符串数组列表

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... 

正如你可以看到我的每一行创建一个字符串数组(采用拆分法以“ - ”),并把所有的字符串数组一个ArrayList内。我不知道如何创建我的CustomAdapter类来完成这项工作。我的其他文件看起来像......

Concerts.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(我甚至不知道我是否在正确的道路上这里)

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(这是该列表将被显示的片段)

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; 
    } 
} 
+1

,我认为更好的方法是创建一个'Concert'类,而不是'私有列表 mAllConcerts;'你就必须'私有列表 mAllConcerts;' –

+0

@DanielNugent嗨,我应该怎么得到的所有字符串值从文本文件转换为Concert实体类?感谢您的评论! – oxyt

回答

2

我建议你做一个CustomAdapter使用对象,而不是字符串数组的数组的ArrayList:

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

所以你只是做:

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; 
} 

} 

而且你的活动:

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; 
    } 
} 
+0

我喜欢你的解决方案,但我没有看到你正在使用从'mytextfile.txt'读取的'Concerts.java'类。 。我应该如何从文本文件中获取这些值?谢谢您的回答! – oxyt

+0

@oxyt从我认为,你应该从活动的方法,而不是音乐会类,如果你仍然想要添加该方法到你的课,你可以阅读文件。但要把它们的属性也放在一起。 – Aiapaec

+0

谢谢你的帮助。我终于做到了! :)之前,我没有在MenuConcerts类中错过您的评论(//所有阅读文件逻辑)。刚刚看到它,并在该课堂中添加了一种方法,现在都很好...感谢所有人guyz! – oxyt

1
  1. 你的ListView在哪里?您不用onCreateView方法初始化它并且您需要将listAdapter设置为ListView
  2. CustomAdaptergetView方法你不需要从xml所有时间膨胀视图。您必须重用创建的视图。检查convertView

    if(convertView ==null){ LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.concert_row, parent, false); }

  3. 为了您TextView's适配器是更好地使用ViewHilder模式 - Example

  4. 你不需要这个周期:

    for(int i = 0; i < concerts.getAllConcerts().size(); i++) { 
         String[] concertRow = concerts.getAllConcerts().get(i);} 
    

使用只有String[] concertRow = concerts.getAllConcerts().get(position);,然后将您的文本设置为文本字段,因为在getView方法只有一个ListView行被创建。

+0

谢谢你的回答......帮助我理解我在这方面有多糟糕:) – oxyt

0

你必须在你的片段XML文件中创建一个列表视图(我假设你膨胀的视图就是这样)。然后你给它分配一个ID(我将以R.id.list为例)。一旦你得到了电话(在onCreateView:

ListView lv = (ListView) view.findViewById(R.id.list); 
// set the adapter 
lv.setAdapter(listAdapter); 

,你应该是好

1

首先,您应该延伸BaseAdapter而不是ArrayAdapter。 在方法getView你可以充气你的row.xml布局。并findById所有的TextViews。

Here是我的自定义适配器示例应用程序。

相关问题