通过引用这个,我创建了以下内容:
main.xml中
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/addBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="addItems"
android:text="Add New Item" />
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false" />
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
ListView list;
ArrayList<String> listItems = new ArrayList<String>();
ArrayAdapter<String> adapter;
int clickCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = (ListView) findViewById(R.id.list);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, listItems);
list.setAdapter(adapter);
list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String item = list.getItemAtPosition(position).toString();
Log.i("MainActivity", "Selected = " + item);
}
});
}
public void addItems(View v) {
listItems.add("Clicked : " + clickCounter++);
adapter.notifyDataSetChanged();
}
}
它完美无缺。但是根据要求,我的每个 listview行不仅仅是一个字符串。相反,它将是由存储在 row.xml 中的imageview和textview组成的视图集合。
现在我的疑问是:
什么会取代adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listItems);
?它会是adapter = new ArrayAdapter<String>(this,R.layout.row, listItems);
??
如何参考每行的imageview和textview?如何设置和获取数据?如何识别他们的点击事件?
是否必须使用Adapter
?或者我能逃脱吗?
任何帮助表示感谢。
答案 0 :(得分:4)
但是根据要求,我的每个listview行不仅仅是一个 串。相反,它将是由imageview组成的视图集合 和textview存储在row.xml中。
=&GT;您正在显示的ListView正在使用普通适配器。如果您希望您的项目包含多个视图,例如Imageview,Textview或任何视图,那么您必须通过扩展BaseAdapter
或ArrayAdapter
来定义自定义适配器类。
什么将取代adapter = new ArrayAdapter(这一点,android.R.layout.simple_list_item_1, listItems中); ?它是适配器=新的 ArrayAdapter(this,R.layout.row,listItems); ??
=&GT;这里ArrayAdapter不起作用,因为你的行xml布局可能包含不同的视图,如ImageView,TextView,Button或任何其他小部件。所以我建议你定义自己的适配器类,你必须覆盖getView()
方法。
如何参考每行的imageview和textview?我该怎么设置 并从他们那里获取数据?如何识别他们的点击事件?
=&GT;如上所述,一旦定义了自定义适配器类,就必须覆盖getView()方法,在其中可以找到行xml布局文件的任何视图,引用它并设置/显示所需的任何数据。
是否必须使用适配器?或者我能逃脱它吗?
=&GT;是的必须,如果没有适配器,您将无法在GridView,ListView,Spinner,Gallery等数据绑定小部件中显示。
定义自定义适配器的示例:
答案 1 :(得分:1)
这些是基本步骤:
android.R.layout.simple_list_item_1
,如果您查看Android源代码只是一个带有单个TextView的布局。现在回答你的问题:
扩展BaseAdapter时,您将实现方法public View getView (int position, View convertView, ViewGroup parent)
。在此方法中,您必须膨胀自定义行布局以创建视图。然后使用findViewById方法找到ImageView和TextView。当您拥有ImageView和TextView时,您可以调用setText或setImageSource来设置数据,并为click事件设置setOnClickListener。
答案 2 :(得分:1)
以下是我项目的代码
考虑您的列表有两个文本字段和一个ImageView,如下面的“row.xml”文件。将其复制到您的res文件夹
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/row_q"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="Solve[{x^2==4,x+y^2==6},{x,y}]"
android:textAppearance="@android:style/TextAppearance.Small"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/row_a"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/AliceBlue"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:textAppearance="@android:style/TextAppearance.Small" />
<ImageView
android:id="@+id/row_a_math"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"/>
<LinearLayout
android:id="@+id/graph_layout"
android:layout_width="match_parent"
android:layout_height="200dp"
android:visibility="gone" >
</LinearLayout>
在您的活动中创建以下类来存储此数据
private class QuesSolnInfo {
public String ques;
public String ans;
public Bitmap ans_b;
public QuesSolnInfo(String ques, String ans, Bitmap ans_b) {
this.ques = ques;
this.ans = ans;
this.ans_b = ans_b;
}
}
//将以下作为班级成员
OutputStringArrayAdapter _outputArrayAdapter = null;
ArrayList<QuesSolnInfo> _outputArrayList = null;
//在onCreate方法
中初始化它们_outputArrayAdapter = new OutputStringArrayAdapter(getActivity(), _outputArrayList);
_outputListView.setAdapter(_outputArrayAdapter);
ArrayAdapter的定义
protected class OutputStringArrayAdapter extends ArrayAdapter<QuesSolnInfo> {
OutputStringArrayAdapter(Context context, ArrayList<QuesSolnInfo> stringArrayList) {
super(context, R.layout.list, stringArrayList);
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, null);
}
TextView t_ques = (TextView) convertView.findViewById(R.id.row_q);
t_ques.setText(getItem(position).ques);
boolean debug = true;
TextView t_ans = (TextView) convertView.findViewById(R.id.row_a);
String texx = getItem(position).ans;
t_ans.setText(texx);
final ImageView w = (ImageView) convertView.findViewById(R.id.row_a_math);
w.setImageBitmap(getItem(position).ans_b);
// Show answer in webview
return convertView;
}
}
现在要在列表中添加任何元素,请执行以下操作
_outputArrayList.add(0, new QuesSolnInfo(string1.string2, bitmap0));
_outputArrayAdapter.notifyDataSetChanged();