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()的方式,根据自己的位置使用不同的布局。
最后,如果您的数据源发生变化,我建议创建一个新适配器,这将帮助您类 更清晰易读。
我做了一个列表适配器 - 它可以工作,但我想在不同的活动上做一些列表视图,这里的问题是我是否需要为每个 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()的方式,根据自己的位置使用不同的布局。
最后,如果您的数据源发生变化,我建议创建一个新适配器,这将帮助您类 更清晰易读。