【问题标题】:Android: How to use List of String arrays inside List rowAndroid:如何在列表行中使用字符串数组列表
【发布时间】:2015-05-05 16:50:41
【问题描述】:

我正在为我的自定义列表视图而苦苦挣扎。我想用包含五个文本视图的自定义row.xml 文件填充我的列表视图。我在raw 文件夹中有一个文本文件mytextfile.txt。它看起来像这样:

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

【问题讨论】:

  • 我认为更好的方法是创建一个Concert 类,而不是private List&lt;String[]&gt; mAllConcerts; 你应该有private List&lt;Concert&gt; mAllConcerts;
  • @DanielNugent 嗨,我应该如何将文本文件中的所有字符串值获取到该 Concert 实体类中?感谢您的评论!

标签: java android arrays android-listview android-arrayadapter


【解决方案1】:

我建议您使用对象的 ArrayList 而不是字符串数组的数组来执行 CustomAdapter:

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

【讨论】:

  • 我喜欢你的解决方案,但我没有看到你正在使用我的 Concerts.java 类,它从 mytextfile.txt 读取。我应该如何从文本文件中获取这些值?谢谢你的回答!
  • @oxyt 从我的想法来看,你应该从活动的方法中读取文件,而不是 Concert 类,如果你仍然想将该方法添加到你的类中,你可以。但是把他们拥有的属性也放进去。
  • 感谢您的帮助。我终于成功了! :) 我确实错过了您之前在 MenuConcerts 课程中的评论(// 此处的所有阅读文件逻辑)。刚刚看到它并在那个类中添加了一个方法,现在一切都很好......感谢你们所有人!
【解决方案2】:
  1. 您的ListView 在哪里?你不用onCreateView方法初始化它,你需要将listAdapter设置为ListView
  2. CustomAdapter getView 方法中,您不需要一直从 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 行。

【讨论】:

  • 感谢您的回答...帮助我了解我在这方面有多糟糕 :)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你必须在你的片段 XML 文件中创建一个列表视图(我假设你膨胀的视图就是那个)。然后为它分配一个 ID(我将使用 R.id.list 作为示例)。接到电话后(在 onCreateView 中:

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

    你应该很好。

    【讨论】:

      猜你喜欢
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2018-05-06
      • 2014-01-04
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多