Android ListView Adapter多个Activity

时间:2018-02-09 08:28:47

标签: java android listview adapter

我做了一个列表适配器 - 它可以工作,但我想在不同的活动上做一些Listview,这是一个问题,我是否需要为每个活动做一个新的适配器? 有没有办法让一个ListAdapter取决于选择哪个Activity来显示特定的视图?

我正在寻找关于getView的东西,但我无法使用它。

这是我在第一个活动中的适配器:

public class ListViewAdapter extends BaseAdapter {

    Context ContextObj;
    List<FruitNames> TempList;


    public ListViewAdapter(List<FruitNames> listValue, Context context)
    {
        this.ContextObj = context;

        this.TempList = listValue;
    }

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

    @Override
    public Object getItem(int position)
    {
        return this.TempList.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewItem viewItem = null;

        if(convertView == null)
        {
            viewItem = new ViewItem();

            LayoutInflater layoutInfiater = (LayoutInflater)this.ContextObj.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            convertView = layoutInfiater.inflate(R.layout.listview_items, null);

            viewItem.NazwaInwentaryzacji = (TextView)convertView.findViewById(R.id.NazwaInwentaryzacji);
            viewItem.DataInwentaryzacji = (TextView)convertView.findViewById(R.id.DataInwentaryzacji);
            viewItem.NrInwentaryzacji = (TextView)convertView.findViewById(R.id.NrInwentaryzacji);


            convertView.setTag(viewItem);
        }
        else
        {
            viewItem = (ViewItem) convertView.getTag();
        }

        viewItem.NazwaInwentaryzacji.setText(TempList.get(position).NazwaInwentaryzacji);
        viewItem.DataInwentaryzacji.setText('['+TempList.get(position).DataInwentaryzacji+']');
        viewItem.NrInwentaryzacji.setText(TempList.get(position).NrInwentaryzacji+'.');


        return convertView;
    }
}

class ViewItem

{
    TextView NazwaInwentaryzacji;
    TextView DataInwentaryzacji;
    TextView NrInwentaryzacji;
    TextView idInwentaryzacji;
    TextView Odswiez;
//    TextView FruitNameTextView;
//    TextView EmailName;

}

3 个答案:

答案 0 :(得分:0)

  

有没有办法让一个ListAdapter取决于选择哪个Activity来显示特定视图?

是的,您可以为所有Activity使用相同的适配器。现在,您的ListViewAdapter构造函数将List作为参数。如果您还传递了LayoutInflater必须膨胀的布局资源ID,那么您可以在getView()中使用它。

顺便说一下,你也将Context传递给了构造函数。您不必这样做,因为在getView()中您可以写

LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

假设您有两个Activity s,其布局文件如下:

activity1.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World"/>
    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

activity2.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#ff0000"
        android:gravity="center"
        android:text="Hello World"
        android:textColor="#ffffff"
        android:textSize="24sp"/>
    <ListView
        android:id="@+id/listView2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

</LinearLayout>

然后在每个Activity的onCreate()中,您可以调用方法initListView()。以下方法属于Activity1,对于Activity2,只需将'1'替换为'2':

private void initListView()
    {
        ListView listView = (ListView) findViewById(R.id.listView1);
        List<String> myDatalist = new ArrayList<>();
        ListViewAdapter listViewAdapter = new ListViewAdapter(myDatalist, R.layout.list_row_1); 
        listView.setAdapter(listViewAdapter);
    }

您会注意到我更改了适配器的构造函数。我的ListViewAdapter版本如下所示:

public class ListViewAdapter extends BaseAdapter
{
    private List<FruitNames> TempList;
    private int layoutResId;

    public ListViewAdapter(List<FruitNames> listValue, int layoutResId)
    {
        this.TempList = listValue;
        this.layoutResId = layoutResId;
    }

    // other methods like before...

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        ViewItem viewItem = null;

        if(convertView == null) {
            viewItem = new ViewItem();
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            convertView = layoutInflater.inflate(layoutResId, null);
            viewItem.NazwaInwentaryzacji = (TextView)convertView.findViewById(R.id.NazwaInwentaryzacji);
            viewItem.DataInwentaryzacji = (TextView)convertView.findViewById(R.id.DataInwentaryzacji);
            viewItem.NrInwentaryzacji = (TextView)convertView.findViewById(R.id.NrInwentaryzacji);
            convertView.setTag(viewItem);
        }
        else{
            viewItem = (ViewItem) convertView.getTag();
        }
        viewItem.NazwaInwentaryzacji.setText(TempList.get(position).NazwaInwentaryzacji);
        viewItem.DataInwentaryzacji.setText('['+TempList.get(position).DataInwentaryzacji+']');
        viewItem.NrInwentaryzacji.setText(TempList.get(position).NrInwentaryzacji+'.');
        return convertView;
    }
}

答案 1 :(得分:0)

活动一

 firstListView=(ListView)findViewById(R.id.listview);
 yourAdapter=new PlayerAdapter(FirstActivity.this,dataList);
 firstListView.setAdapter(yourAdapter);

活动二

 secondListView=(ListView)findViewById(R.id.listview);
 yourAdapter=new PlayerAdapter(SecondActivity.this,dataList);
 secondListView.setAdapter(yourAdapter);

这是您可以在不同活动中使用的方法。

答案 2 :(得分:0)

如果您要使用相同的对象类型(在您的情况下为 FruitNames ),并且显示该项目的方式不会改变,您可以重复使用适配器,而不会出现任何问题。

另一方面,如果您要使用相同数据源,但希望以不同方式显示您的商品,则可以使用{{ 3}}根据您的位置使用不同布局的方法。

最后,如果数据源发生变化,我建议您创建一个新适配器,这将有助于您使您的课程更清晰,更易于阅读