【问题标题】:Fill a ListView based on a List<Items>根据 List<Items> 填充 ListView
【发布时间】:2014-12-04 12:58:52
【问题描述】:

我是 StackOverflow 的新手,这是我的第一个问题。 我一直在四处寻找帮助,但没有找到任何适合我的方法。

我正在使用 Android Studio 0.8.14,我想根据从 SQLite 获得的项目列表填充 ListView,每个人都说我应该使用 ArrayAdapter,但这对我不起作用,有人可以帮我吗出来了??

这就是我构建项目列表的方式:

//getting all items
public List < Item > getAllItems() {
  SQLiteDatabase db = this.getReadableDatabase();
  List < Item > items = new ArrayList < Item > ();
  String selectQuery = "SELECT * FROM " + TABLE_ITEM;
  Cursor c = db.rawQuery(selectQuery, null);

  // looping through all rows and adding to list
  if (c.moveToFirst()) {
    do {
      Item it = new Item();
      it.setId(c.getInt(c.getColumnIndex(KEY_ID)));
      it.setName(c.getString(c.getColumnIndex(KEY_NAME)));
      it.setDescription(c.getString(c.getColumnIndex(KEY_DESCRIPTION)));
      it.setPrice(c.getDouble(c.getColumnIndex(KEY_PRICE)));
      it.setAdd_info(c.getString(c.getColumnIndex(KEY_ADD_INFO)));
      it.category_id = c.getInt(c.getColumnIndex(KEY_ITEM_CATEGORY));
      it.vegetarian = c.getInt(c.getColumnIndex(KEY_VEGETARIAN));
      it.sustainable = c.getInt(c.getColumnIndex(KEY_SUSTAINABLE));
      it.vegan = c.getInt(c.getColumnIndex(KEY_VEGAN));
      it.frozen = c.getInt(c.getColumnIndex(KEY_FROZEN));
      it.gluten_free = c.getInt(c.getColumnIndex(KEY_GLUTEN_FREE));
      it.gm_free = c.getInt(c.getColumnIndex(KEY_GM_FREE));

      // adding to item list
      items.add(it);
    } while (c.moveToNext());
  }
  return items;
}

在我的 MainActivity.java 我有这个:

public class MainActivity extends FragmentActivity {

  private DatabaseHelper db;
  List < String > categoryNames;
  int categoryCount = 0;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_categories);
    
    db = new DatabaseHelper(this.getApplicationContext());
    categoryNames = db.getAllCategoryNames();
    categoryCount = catNames.size();

    ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
  }

  public class PagerAdapter extends FragmentPagerAdapter {

    public PagerAdapter(FragmentManager fm) { super(fm); }

    public Fragment getItem(int index) {

      if (index >= 0 && index < categoryCount)
        return new ListTheItems();
      else
        return null;
    }

    public CharSequence getPageTitle(int position) {
      String title = "no title";

      if (position >= 0 && position < categoryCount) {
        title = categoryNames.get(position);
      }

      return title;
    }

    public int getCount() {
      return categoryCount;
    }
  }


}

这是 ListTheItems.java,我尝试在 ListView 中显示项目列表中的数据:

public class ListTheItems extends Fragment {

  private List < Item > allItems = new ArrayList < Item > ();
  private DatabaseHelper db;
  private ListView listView;

  public void onCreate(Bundle saveInstanceState) {
    setContentView(R.layout.list);

    listView = (ListView) findViewById(R.id.itemList);
    allItems = db.getAllItems();

    ArrayAdapter < String > arrayAdapter = new ArrayAdapter < String > (this, android.R.layout.simple_list_item_1,
      allItems);

    listView.setAdapter(arrayAdapter);
  }
}

我正在使用 Fragments,但在 ListTheItems.java 中,我在方法 'setContentView' 和 'findViewById' 上遇到错误,并且无法解析 'ArrayAdapter' 构造函数。

【问题讨论】:

    标签: android-layout android-fragments android-listview fragment


    【解决方案1】:

    将视图层次结构加载到片段中的方式比将其加载到 Activity 中的方式。试试这个:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout. list, container, false);
        // You have to call findViewById on rootView, since the fragment doesn't know
        // what your views are until you return rootView from this function
        listView = (ListView) rootView.findViewById(R.id.itemList);
    
        allItems = db.getAllItems();
        Activity activity = (Activity) container.getContext();
        ArrayAdapter < Item > arrayAdapter = new ArrayAdapter < Item > (activity, android.R.layout.simple_list_item_1,
          allItems);
        listView.setAdapter(arrayAdapter);
        return rootView;
    }
    

    编辑:

    抱歉,我错过了类型差异。您收到构造函数错误的原因是您的 List 参数的模板类型需要与您的 ArrayAdapter 的模板类型匹配。我已经修复了上面的代码,将arrayAdapter的类型更改为ArrayAdapter以匹配allItems的类型,这是一个List

    【讨论】:

    • 我已经尝试过类似的方法。这里:(活动,android.R.layout.simple_list_item_1,allItems);我收到一条错误消息:“无法解析构造函数 'ArrayAdapter(android.app.Activity,int,java.util.List)'”做!
    【解决方案2】:

    最后我的问题的解决方案是创建我自己的适配器,并根据@Bruce 的帮助更改 MainActivity.java,如下所示:

    public Fragment getItem(int index) {
      if (index >= 0 && index < categoryCount) {
        ListItemsFragment lif = new ListItemsFragment();
        lif.allItems = db.getAllItemsByCategory(index + 1);
        return lif;
      } else
        return null;
    }

    并像这样更改 ListTheItems.java:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
      View rootView = inflater.inflate(R.layout.list, container, false);
      listView = (ListView) rootView.findViewById(android.R.id.list);
      MyAdapter adapter = new MyAdapter(this.getActivity(), allItems);
      listView.setAdapter(adapter);
      return rootView;
    }

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多