【问题标题】:Android different Row layout only for first row in BaseAdapterAndroid不同的行布局仅适用于BaseAdapter中的第一行
【发布时间】:2014-09-08 12:51:55
【问题描述】:

我正在制作一个 Custom listview,其中 Custom Adapter 扩展了 BaseAdapter。现在我想为第一行设置一个不同的 layout,为所有其他行设置另一个 layout。我正在使用此代码,但它为 第一行 设置了 特殊布局,并且在每 5/6 行后重复一次。我该如何修复它,并且只能为第一行设置它,而为所有其他行设置另一个布局。

public class NewsAdapter extends BaseAdapter {
    private Context context;
    List<News> newsList;
    private Typeface customBanglaFont;
    private LayoutInflater inflater;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public NewsAdapter(Context context, List<News> newsList){
        this.context = context;
        this.newsList = newsList;
    }

    @Override
    public int getCount() {
        return newsList.size();
    }

    @Override
    public Object getItem(int arg0) {
        return newsList.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        return arg0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        View row;
        row = convertView;
        ViewHolder holder=null;

        if(row == null){
            if(position == 0){
                inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row =inflater.inflate(R.layout.row_single_big_view,viewGroup,false);
            }
            else{
                inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row =inflater.inflate(R.layout.row_single_default,viewGroup,false);
            }

            holder = new ViewHolder(row);
            row.setTag(holder);
        }
        else{
            holder = (ViewHolder) row.getTag();
        }

        if (imageLoader == null){
            imageLoader = AppController.getInstance().getImageLoader();
        }

        final News news = newsList.get(position);
        customBanglaFont = Typeface.createFromAsset(viewGroup.getContext().getAssets(), "fonts/SolaimanLipi.ttf");
        holder.newsTitleView.setTypeface(customBanglaFont);
        holder.newsTitleView.setText(news.getTitle());
        holder.thumbNail.setImageUrl(news.getFeaturedImgSrc(), imageLoader);

        return row;
    }
}

/**
 * Custom View Holder Class
 * @author Tonmoy
 *
 */
class ViewHolder{

    TextView newsTitleView;
    NetworkImageView thumbNail;

    public ViewHolder(View v) {
        // TODO Auto-generated constructor stub
        newsTitleView = (TextView) v.findViewById(R.id.news_title);
        thumbNail = (NetworkImageView) v.findViewById(R.id.news_image);
    }

}

【问题讨论】:

    标签: java android android-listview baseadapter layout-inflater


    【解决方案1】:

    为什么不使用已经内置在 ListView 中的 Header 功能来处理这个特定的事情。

    文档: http://developer.android.com/reference/android/widget/ListView.html#addHeaderView%28android.view.View,%20java.lang.Object,%20boolean%29

    或一个 SO 问题: Using ListView : How to add a header view?

    【讨论】:

    • 所以终于解决了!!!我使用了 Header 视图,经过其他一些小定制后它工作得很好!!!非常感谢@Booger
    【解决方案2】:

    你的尝试是错误的。您将能够以您的方式仅对一种布局进行充气。实际上,在方法第一次返回后,convertView is not null。要快速修复,您可以覆盖getViewTypeCountgetItemViewType。这样您将获得convertViews eqaul 到getViewTypeCount 的返回值,或者您可以将第一项添加为ListView 的标题视图

    【讨论】:

    • 谢谢。你能给我一些例子吗?看不懂
    猜你喜欢
    • 2021-01-19
    • 2021-11-28
    • 1970-01-01
    • 2016-03-27
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多