Android 如果每个列表视图有多个文本视图,如何设置适配器?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11106418/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to set adapter in case of multiple textviews per listview?
提问by Harsh
I have a multiple TextView
s per list item in my ListView
. I've learned to write a proper getView
method I believe but I'm not sure ho do I use setAdapter
to call that method.
我有一个多TextView
每个列表项在我的ListView
。我已经学会了编写getView
我相信的正确方法,但我不确定我用什么setAdapter
来调用该方法。
private static String[] project = {"proj1","proj2"};
private static String[] workRequests = {"requirement gathering", "design"};
private static String[] startDate = {"02/21/2012","07/15/2011"};
private static String[] status = {"WIP","DONE"};
ListView mListView;
public class MyDashboardActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mydashboard);
final LayoutInflater mInflater = LayoutInflater.from(this);
mListView = (ListView)findViewById(R.id.dashboardList);
mListView.setAdapter(
// How do I set the adapter?
);
}
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("enters");
if(convertView == null){
convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null);
}
((TextView) convertView.findViewById(R.id.project)).setText(project[position]);
((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]);
((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]);
((TextView) convertView.findViewById(R.id.status)).setText(status[position]);
return convertView;
}
This is the xml layout:
这是xml布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/home_root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- Include Action Bar -->
<include layout="@layout/actionbar_layout" />
<ListView
android:id="@+id/dashboardList"
style="@style/LeftHeaderText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="@drawable/innerdashboard_bg"
android:textColor="@color/textColor" >
<TextView android:id="@+id/project" />
<TextView android:id="@+id/work_request" />
<TextView android:id="@+id/start_date" />
<TextView android:id="@+id/status" />
</ListView>
</LinearLayout>
I've tried a few ways, none of which worked. Could anyone please suggest how to set the adapter in this case? Thanks!
我尝试了几种方法,都没有奏效。谁能建议在这种情况下如何设置适配器?谢谢!
回答by FabiF
You need to implement your own Adapter. My way is to also define an object which "represents" a view.
您需要实现自己的适配器。我的方法是还定义一个“代表”视图的对象。
Below, there is a very simple example with two TextViews
to fit your needs.
下面是一个非常简单的示例,其中有两个TextViews
可以满足您的需求。
The object which represents a view (a row in the ListView) :
代表视图的对象(ListView 中的一行):
public class CustomObject {
private String prop1;
private String prop2;
public CustomObject(String prop1, String prop2) {
this.prop1 = prop1;
this.prop2 = prop2;
}
public String getProp1() {
return prop1;
}
public String getProp2() {
return prop2;
}
}
Next the custom adapter :
接下来是自定义适配器:
public class CustomAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ArrayList<CustomObject> objects;
private class ViewHolder {
TextView textView1;
TextView textView2;
}
public CustomAdapter(Context context, ArrayList<CustomObject> objects) {
inflater = LayoutInflater.from(context);
this.objects = objects;
}
public int getCount() {
return objects.size();
}
public CustomObject getItem(int position) {
return objects.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.your_view_layout, null);
holder.textView1 = (TextView) convertView.findViewById(R.id.id_textView1);
holder.textView2 = (TextView) convertView.findViewById(R.id.list_id_textView2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView1.setText(objects.get(position).getprop1());
holder.textView2.setText(objects.get(position).getprop2());
return convertView;
}
}
Now you can define and set your adapter in your activity :
现在您可以在您的活动中定义和设置您的适配器:
ArrayList<CustomObject> objects = new ArrayList<CustomObject>();
CustomAdapter customAdapter = new CustomAdapter(this, objects);
listView.setAdapter(customAdapter);
Now you only have to manage your CustomObject's in the objects list.
Don't forget to invoke customAdapter.notifyDataSetChanged()
when you want repercute modifications on the ListView.
现在您只需在对象列表中管理您的自定义对象。customAdapter.notifyDataSetChanged()
当您想要对 ListView 重新进行修改时,不要忘记调用。
回答by Ben Jakuben
Your getView() code needs to go into a class that extends BaseAdapter or one of its subclasses.
您的 getView() 代码需要进入一个扩展 BaseAdapter 或其子类之一的类。
One way to do this is to create a private class within your MyDashboardActivity. Here's a quick example below (some additional code will be required). You'll probably also want a custom object to associate all the things you want to display in one list item. Instead of multiple arrays, have one array of a custom type that has properties for each value you are tracking.
一种方法是在 MyDashboardActivity 中创建一个私有类。下面是一个快速示例(需要一些额外的代码)。您可能还需要一个自定义对象来关联您想要在一个列表项中显示的所有内容。而不是多个数组,有一个自定义类型的数组,该数组具有您正在跟踪的每个值的属性。
One more thing: your four TextViews should go into their own layout file (see list_item.xml here). That item layout file gets hooked up through the constructor of the custom adapter (I added a comment in the code below to highlight this).
还有一件事:您的四个 TextView 应该进入它们自己的布局文件(请参阅此处的list_item.xml )。该项目布局文件通过自定义适配器的构造函数连接起来(我在下面的代码中添加了注释以突出显示这一点)。
protected CustomAdapter mAdapter;
public class MyDashboardActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mydashboard);
final LayoutInflater mInflater = LayoutInflater.from(this);
mListView = (ListView)findViewById(R.id.dashboardList);
mAdapter = new CustomAdapter(this, <array to be adapted>);
mListView.setAdapter(mAdapter);
}
private class CustomAdapter extends ArrayAdapter<String> {
protected Context mContext;
protected ArrayList<String> mItems;
public CustomAdapter(Context context, ArrayList<String> items) {
super(context, R.layout.custom_list_item, items); // Use a custom layout file
mContext = context;
mItems = items;
}
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("enters");
if(convertView == null){
convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null);
}
// You'll need to use the mItems array to populate these...
((TextView) convertView.findViewById(R.id.project)).setText(project[position]);
((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]);
((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]);
((TextView) convertView.findViewById(R.id.status)).setText(status[position]);
return convertView;
}
}
}
回答by GalacticGhost
There are a few ways to do this. I'll show you my way wich contains two layouts, the first being just the ListView its self and the other is how the text should appear per list item.
有几种方法可以做到这一点。我将向您展示我的方式,其中包含两个布局,第一个只是 ListView 本身,另一个是每个列表项的文本应如何显示。
listset.xml
列表集.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ListView
android:id="@+id/shipMenu"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
listitems.xml (You can also put images in here, the idea here is control)
listitems.xml(这里也可以放图片,这里的思路是控制)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/makerID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="25dp"/>
</LinearLayout>
With the above I don't have the artwork yet but I intend to add an ImageView for icons (and you can add more TextViews too). Here is my custom adapter class.
有了上面的内容,我还没有图稿,但我打算为图标添加一个 ImageView(您也可以添加更多的 TextView)。这是我的自定义适配器类。
ListAdapter.java
列表适配器
class ListAdapter extends ArrayAdapter <String>
{
public ListAdapter(Context context, String[] values) {
super(context, R.layout.listitems, values); //set the layout that contains your views (not the one with the ListView)
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.listitems, parent, false); //same here.
String text = getItem(position);
TextView makerID = (TextView) view.findViewById(R.id.makerID);
makerID.setText(text);
return view;
}
}
In your main activity file set
在您的主要活动文件集中
setContentView (R.layout.listset);
And add this underneath in same brackets as setContentView()
并将其添加到与 setContentView() 相同的括号中
ListAdapter adapter = new ListAdapter(this, MyString[]); //place your String array in place of MyString
ListView lv = (ListView) findViewById(R.id.ListViewID); //the ID you set your ListView to.
lv.setAdapter(adapter);
Edit
编辑
I'm a bit late to the party it looks like but maybe this will help someone.
看起来我参加聚会有点晚了,但也许这会对某人有所帮助。