【问题标题】:How to inflate a layout which itself contains a linearlayout in itself?如何膨胀本身包含线性布局的布局?
【发布时间】:2013-09-09 09:51:56
【问题描述】:

我正在制作一个自定义适配器。我的ListView 的 list_item 本身有一个LinearLayout,稍后我将在其中添加ImageViews。 我正在使用以下代码:

public class Adapter extends ArrayAdapter<Row_Item> {
    private java.util.List<Row_Item> List;
    private Context context;

    public Adapter(List<Row_Item> list, Context ctx) {
        super(ctx, R.layout.row_item, list);
        this.List = list;
        this.context = ctx;
    }

    public int getCount() {
        return List.size();
    }

    public Row_Item getItem(int position) {
        return List.get(position);
    }

    public long getItemId(int position) {
        return List.get(position).hashCode();
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        TopicHolder holder = new TopicHolder();
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.row_item, null);
            TextView tv = (TextView) v.findViewById(R.id.textView);
            *LinearLayout* l = (LinearLayout) v.findViewById(R.id.myLayout);

            holder.topic = tv;
            holder.myLayout = l;
            v.setTag(holder);
        } else
            holder = (TopicHolder) v.getTag();
        Row_Item p = List.get(position);
        holder.topic.setText(p.getName());
        ImageView imgUsers;
        for (int i = 0; i < some_parameter; i++) {                  imgUsers = new ImageView(context);
                    imgUsers.setImageResource(some_image);
                    holder.myLayout.addView(imgUsers); //add that image to my linearlayout
                } 
        return v;
    }

    private static class TopicHolder {
        public TextView topic;
        public LinearLayout myLayout;
        // public ImageView notifications;
    }
}

所以这里发生的是getView() 被无限调用。另外,我在调用此适配器的类中设置了onItemClickListener。由于适配器类没有终止,监听器不工作,应用程序保持静止。

另外,我尝试过myLayout.getChildCount() 之类的方法,如果它大于图​​像数量,则返回,但无限循环仍然没有终止。

【问题讨论】:

  • 自定义适配器无需调用 super
  • getView 中是否需要 for 循环?是否需要在单个列表项中设置多个图像?还是每个列表项只有一张图片?如果只需要一张图片,您需要删除 getView 中的 for 循环..
  • getView 将根据列表中有多少项目被调用。那就是从 getCount() 返回的可能。它不会被无限调用。这里的 some_parameter 是什么?
  • 请去扔一些很好的自定义列表视图教程,网上有很多很好的教程
  • @amj 是的,我正在插入多个图像。这是由 myLinearLayout.addView(imgUsers) 完成的

标签: android android-layout android-listview custom-adapter


【解决方案1】:

public View getView(int position, View convertView, ViewGroup parent) { 视图 v = convertView;

    TopicHolder holder;
    if (convertView == null) {

        LayoutInflater inflater = context.getLayoutInflater();
        v = inflater.inflate(R.layout.row_item, null);
        holder = new TopicHolder();

        holder.topic = (TextView) v.findViewById(R.id.textView);
        holder.myLayout = (LinearLayout) v.findViewById(R.id.myLayout);

        v.setTag(holder);
    } else {
        holder = (TopicHolder) v.getTag();
    }
    Row_Item p = List.get(position);
    holder.topic.setText(p.getName());
    ImageView imgUsers;
            Log.e("some_param",some_parameter+"");
    for (int i = 0; i < some_parameter; i++) {
        imgUsers = new ImageView(context);
                 Log.e("some_param",some_image+"   "+i);
        imgUsers.setImageResource(some_image);
        holder.myLayout.addView(imgUsers);
    }
    return v;
}

如果 getview 仍然无法正常工作,请在 getview 中调试内部循环,以便在线性布局中添加图像。

初始化 some_parameter 值默认为 0。

【讨论】:

  • 不,它仍然没有任何区别。而且我已经对内部循环施加了所有约束,即使我已经写了语句“return v”以防 myLayout.getChildCount() >= some_parameter。但它仍然有效。
  • 这个问题的答案在这里非常相关:stackoverflow.com/questions/10100324/…
【解决方案2】:

我得到了解决方案。我在适配器本身中设置了 onClickListener,它工作正常。

public class Adapter extends ArrayAdapter<Row_Item> {
    private java.util.List<Row_Item> List;
    private Context context;

    public Adapter(List<Row_Item> list, Context ctx) {
        super(ctx, R.layout.row_item, list);
        this.List = list;
        this.context = ctx;
    }

    public int getCount() {
        return List.size();
    }

    public Row_Item getItem(int position) {
        return List.get(position);
    }

    public long getItemId(int position) {
        return List.get(position).hashCode();
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        TopicHolder holder = new TopicHolder();
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.row_item, null);
            TextView tv = (TextView) v.findViewById(R.id.textView);
            *LinearLayout* l = (LinearLayout) v.findViewById(R.id.myLayout);

            holder.topic = tv;
            holder.myLayout = l;
            v.setTag(holder);
        } else
            holder = (TopicHolder) v.getTag();
        Row_Item p = List.get(position);
        holder.topic.setText(p.getName());
        ImageView imgUsers;
        for (int i = 0; i < some_parameter; i++) {                  imgUsers = new ImageView(context);
                    imgUsers.setImageResource(some_image);
                    holder.myLayout.addView(imgUsers); //add that image to my linearlayout

        OnClickListener click= new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //do something (which I wasn't able to do earlier)
                }
            };
            v.setOnClickListener(click);
}
        return v;
    }

    private static class TopicHolder {
        public TextView topic;
        public LinearLayout myLayout;
        // public ImageView notifications;
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多