我正在尝试为我的应用构建自定义适配器,其主屏幕是ListActivity
,中间有ListView
。关于我如何创建适配器我完全不知道,所以我想知道是否有人知道任何好的教程可以引导我完成它。
答案 0 :(得分:2)
我记得学习ArrayAdapters并不容易。互联网上有很多教程。
扩展ArrayAdapter你可能想要覆盖方法。
getCount() - 列表中的项目数。
public int getViewTypeCount() - ArrayList将呈现数据的方式数。通常这是1.但是如果您的列表中有多种类型的数据,它有多个视图,那么您将不得不更改此数字。示例是联系人列表。它有两种类型。 1表示联系人本身,另一个是您在A,B等中看到的字母类别。
getItemViewType(position) - 对于该职位,应该获得什么类型?通常,1。除非您有多种类型。
public long getItemId(int position) - 您要呈现的项目类型。
真正重要的一个! public View getView(int position,View convertView,ViewGroup parent)
下面是getView使用的示例 ViewHolder模式。 ViewHolder 有助于使您的滚动顺利 因为你不必重做所有这些 findViewById一遍又一遍 再次。每次更新视图 用新信息使用 holder.WidgetName来做它。
/* Hypotetical list of names. */
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
ListItemWithSideButton view;
if(convertView == null) {
view = (ListItemWithSideButton)_inflater.inflate(R.layout.some_line_item, parent, false);
holder = new ViewHolder();
view.setTag(holder);
holder.SomeButton = view.findViewById(R.id.some_button);
/* Other views. */
}
else {
view = (ListItemWithSideButton) convertView;
holder = (ViewHolder) convertView.getTag();
}
/* Get the item. */
final String name = getItem(position);
/* Update the data of the view with the new information. */
holder.SomeButton.setText(name);
return view;
}
static class ViewHolder {
Button SomeButton;
/* Other views. */
}
}
答案 1 :(得分:1)
现在我没有任何关于给你的提及,但这就是你可能正在做的事情来获得你想要的东西:
您可能在XML中有ListView,因此在代码中实例化ListView对象:
ListView myList = (ListView)findViewById(R.id.myListView)
一旦引用它,就创建一个扩展BaseAdapter的自定义类。
一个好主意是将此类放在Activity类中,以便它可以访问您的Activity所拥有的所有数据。
在扩展BaseAdapter时,为了让工作正常,您需要做一些事情。
我在下面解释所有这些,但实现BaseAdapter的getView()方法是最重要的。 每次ListView绘制一行时,运行时系统都会调用此方法。
所以你应该在这个方法中做所有事情,你想要为一行完成。
找到以下代码:
Class myListActivity extends Activity{
... some code here...
public void onCreate(Bundle savedInstanceState){
.....
myList.setAdapter(new myCustomAdapter());
.....
}
/**
*Custom Adapter class for the ListView containing data
*/
class myCustomAdapter extends BaseAdapter{
TextView userName;
/**
* returns the count of elements in the Array that is used to draw the text in rows
* @see android.widget.Adapter#getCount()
*/
@Override
public int getCount() {
//return the length of the data array, so that the List View knows how much rows it has to draw
return DataArr.length;
}
/**
* @param position The position of the row that was clicked (0-n)
* @see android.widget.Adapter#getItem(int)
*/
@Override
public String getItem(int position) {
return null;
}
/**
* @param position The position of the row that was clicked (0-n)
* @see android.widget.Adapter#getItemId(int)
*/
@Override
public long getItemId(int position) {
return position;
}
/**
* Returns the complete row that the System draws.
* It is called every time the System needs to draw a new row;
* You can control the appearance of each row inside this function.
* @param position The position of the row that was clicked (0-n)
* @param convertView The View object of the row that was last created. null if its the first row
* @param parent The ViewGroup object of the parent view
* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
final int pos = position;
if(row == null){
//getting custom layout to the row
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.list_row, parent, false);
}
//get the reference to the textview of your row. find the item with row.findViewById()
userName= (TextView)row.findViewById(R.id.user_name);
userName.setText(DataArr[position]);
return row; //the row that ListView draws
}
}
}
希望它对你有所帮助。
请记住在单独的布局文件中创建行的布局。
如果您想要深入了解,请在CommonsGuy的网站上尝试this link。这是他精彩的书的摘录,专门处理ListView自定义适配器
编辑:这是关于它的博文和示例项目:http://thetechnib.blogspot.com/2010/12/android-tutorial-custom-adapter-for.html