在哪里可以找到创建自定义ArrayAdapter的好教程?

时间:2010-12-06 05:27:36

标签: java android android-arrayadapter

我正在尝试为我的应用构建自定义适配器,其主屏幕是ListActivity,中间有ListView。关于我如何创建适配器我完全不知道,所以我想知道是否有人知道任何好的教程可以引导我完成它。

2 个答案:

答案 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)

  • 位置显然是列表中的当前项目。
  • convertView用于查看 回收。如果一个项目意味着什么 滚动屏幕,它的视图是 等待被重用 另一个项目将会出现 屏幕。这有助于提高性能 你只有大约8个左右 最大屏幕上的相同视图 最初convertView将为null 因为除了as之外它不能重复使用 用户在屏幕上滚动你会 抓住他们。 ViewGroup父母我不是这样 确定在视野中使用它 充气。

下面是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