可以使用数组对象参数的Listview Adapter吗?

时间:2018-11-06 17:13:27

标签: java android

我不清楚Android Studio中的Listview适配器的详细信息。

我已经看到了许多使用它们的示例,但是从来没有想过使用它们的方式。

我正在尝试使用数组中相同类的对象的参数填充Listview。

我有一个对象数组,其中包含2个String参数和1个Localtime参数。

到目前为止,我仅看到了一些示例,其中它们赋予适配器的每个不同值都是单独的数组的一部分。

我想做的是给适配器3个来自同一数组的对象的不同参数。

这可能吗?

我认为有可能,但是我不确定该怎么做。

示例:

public class MainActivity extends AppCompatActivity {

    ListView myListView;
    String[] items;
    String[] prices;
    String[] descriptions;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        myListView = (ListView) findViewById(R.id.myListView);
        items = res.getStringArray(R.array.items);
        prices = res.getStringArray(R.array.prices);
        descriptions = res.getStringArray(R.array.descriptions);

        ItemAdapter itemAdapter = new ItemAdapter(this, items, prices, 
        descriptions);
        myListView.setAdapter(itemAdapter);

这里,项目,价格和描述被声明为字符串数组,并在资源中实例化为3个字符串数组。稍后,它们在Adapter类的构造函数中被引用。

相反,我希望它们指向的不是数组,而是指向单个数组中同一类对象的参数。

或者,如果不可能的话,我可以从数组中获取所有对象的参数,并为每个对象创建一个单独的数组,但是我觉得那是不必要的,并且必须有一种简单的方法来做到这一点,但是我只是不知道该怎么做。

编辑: 我在youtube上发现了一个名为“ Android初学者教程#8-用于显示多列的自定义ListView适配器”的教程视频,该视频正是我想要的。

2 个答案:

答案 0 :(得分:0)

您应该尝试使用BaseAdapter。

import android.widget.ListAdapter;

public class ListAdapter extends BaseAdapter implements ListAdapter {
    private ArrayList<Object> list;
    private Context context;

    ListAdapter(ArrayList<Object> list, Context context) {
        this.list = list;
        this.context = context;
    }

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

    @Override
    public Object getItem(int pos) {
        return list.get(pos);
    }

    @Override
    public long getItemId(int pos) {
        return 0L;
        //just return 0 if your list items do not have an Id variable.
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;

        return view;
    }
}

并将其称为“活动”

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        ArrayList<Object> myList= new ArrayList<>();

        //here you can add elements of type Object to your ListAdapter

        //instantiate custom adapter
        ListAdapter adapter = new ListAdapter(myList, this);

        //handle listview and assign adapter
        ListView lView = findViewById(android.R.id.list);
        lView.setAdapter(adapter);
    }

}

答案 1 :(得分:0)

您需要将这些数组包装在单个模型类下,例如Product

class Product {

    private String item;
    private String description;
    private int price;

    public Product(String item, String description, int price)
    {
        this.item = item;
        this.description = description;
        this.price = price;
    } 

    //getter setter here

}

然后在您的活动中

public class MainActivity extends AppCompatActivity {

    ListView myListView;
    String[] items;
    String[] prices;
    String[] descriptions;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        myListView = (ListView) findViewById(R.id.myListView);
        items = res.getStringArray(R.array.items);
        prices = res.getStringArray(R.array.prices);
        descriptions = res.getStringArray(R.array.descriptions);

        ArrayList<Product> productList = new ArrayList<>();

        for(int i=0; i<item.lenght; i++)
             productList.add( new Product(items[i],descriptions[i],Integer.parseInt( prices[i] ) );


        ItemAdapter itemAdapter = new ItemAdapter(this, productList);
        myListView.setAdapter(itemAdapter);
    }
  }

您需要将ArrayAdapter扩展为getView(),这样{p}

 class itemAdapter extends ArrayAdapter<Product>
  {


    @Override
    public view getView(final int position, View convertView, ViewGroup parent)
    {
         View view = inflateLayout(layout xml here);

         Product product = getItem(position);

         TextView view = (TextView) view.findViewById(id here);
         TextView.setText(product.getItem());
         .
         .
         .
         .

         return view

    }


  }