我做了一个列表适配器 - 它可以工作,但我想在不同的活动上做一些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;
}
答案 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}}根据您的位置使用不同布局的方法。
最后,如果数据源发生变化,我建议您创建一个新适配器,这将有助于您使您的课程更清晰,更易于阅读强>