Android ListView 适配器多个 Activity

Android ListView Adapter multiple Activity

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

我一直在寻找有关 getView 的信息,但我无法使用它。

首先是我的适配器Activity:

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;

}

Is there a way to make one ListAdapter depend on which Activity is selected to display a specific view?

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

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

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

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

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

Activity一个

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

Activity两个

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

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

如果您要使用相同的对象类型在您的例子中是 FruitNames),并且 方式你显示该项目没有改变,你可以在其他活动中重复使用你的适配器没有任何问题。

另一方面,如果您要使用相同的数据源,但想以不同的方式显示您的项目,可以使用getItemViewType()的方式,根据自己的位置使用不同的布局。

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