【问题标题】:Android: Custom List Adapter image, text, sub text and checkboxAndroid:自定义列表适配器图像、文本、子文本和复选框
【发布时间】:2013-07-16 14:59:34
【问题描述】:

首先,我很抱歉我的英语不好,也许还有我的愚蠢问题(我是新手)。 我想实现一个格式化为标题的选项面板。 所以这里是我的代码:

listview_item_row.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp">

     <ImageView 
        android:id="@+id/imgIcon"
        android:contentDescription="option image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

     <TextView
         android:id="@+id/txtText"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_toRightOf="@id/imgIcon"
         android:paddingLeft="15dp"
         android:textSize="20sp" />

     <TextView
         android:id="@+id/txtSubText"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_toRightOf="@id/imgIcon"
         android:layout_below="@id/txtText"
         android:paddingLeft="15dp"
         android:textSize="14sp" />

     <CheckBox
         android:id="@+id/checkBox"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_toRightOf="@id/txtText" />

</RelativeLayout>

Row.java

    public class Row {
    public int icon;
    public String text;
    public String subtext;
    public Row(){
        super();
    }

    public Row(int icon, String text ,String subtext) {
        super();
        this.icon = icon;
        this.text = text;
        this.subtext = subtext;
    }
}

RowAdapter.java

    public class RowAdapter extends ArrayAdapter<Row>{

    Context context; 
    int layoutResourceId;    
    Row data[] = null;

    public RowAdapter(Context context, int layoutResourceId, Row[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View myRow = convertView;
        RowHolder holder = null;

        if(myRow == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            myRow = inflater.inflate(layoutResourceId, parent, false);

            holder = new RowHolder();
            holder.imgIcon = (ImageView)myRow.findViewById(R.id.imgIcon);
            holder.txtText = (TextView)myRow.findViewById(R.id.txtText);
            holder.txtSubText = (TextView)myRow.findViewById(R.id.txtSubText);
            holder.checkBox = (CheckBox)myRow.findViewById(R.id.checkBox);

            myRow.setTag(holder);
        }
        else
        {
            holder = (RowHolder)myRow.getTag();
        }

        Row row = data[position];
        holder.txtText.setText(row.text);
        holder.imgIcon.setImageResource(row.icon);
        holder.txtSubText.setText(row.subtext);

        return myRow;
    }

    static class RowHolder
    {
        ImageView imgIcon;
        TextView txtText;
        TextView txtSubText;
        CheckBox checkBox;
    }
}

现在我在开始活动时不显示任何复选框,即使我已经给它充气了。我该如何解决这个问题?

另外,如果我可以利用这个问题,当我必须为复选框实现 onClickListener 时,我如何理解单击了哪个复选框? 我会做这样的事情:

...
Row row = data[position];
holder.txtText.setText(row.text);
holder.imgIcon.setImageResource(row.icon);
holder.txtSubText.setText(row.subtext);
holder.check..setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
            // my code here
        }

    }
});
...

我认为“位置”是关键,但我不知道如何使用它。

【问题讨论】:

    标签: listadapter


    【解决方案1】:

    这是问题的开始!

    我用过,效果很好

    public class ImageAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
    
        public ImageAdapter() {
            //Largeur des colonnes
            LargeurCol = (int) ((largeurEcran / 4)-7);
            System.out.println(LargeurCol);
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        public int getCount() {
            return count;
        }
    
        public Object getItem(int position) {
            return position;
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.galleryitem, null);
                holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);
                holder.imageview.setLayoutParams(new RelativeLayout.LayoutParams(LargeurCol, LargeurCol));
                holder.checkbox = (CheckBox) convertView.findViewById(R.id.itemCheckBox);
                holder.checkbox.setButtonDrawable(R.drawable.checkbox);
                convertView.setTag(holder);
            }
            else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.checkbox.setId(position);
            holder.imageview.setId(position);
            holder.checkbox.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    CheckBox cb = (CheckBox) v;
                    int id = cb.getId();
                    if (thumbnailsselection[id]){
                        cb.setChecked(false);
                        thumbnailsselection[id] = false;
                    } else {
                        cb.setChecked(true);
                        thumbnailsselection[id] = true;
                    }
                }
            });
            holder.imageview.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    int id = v.getId();
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setDataAndType(Uri.parse("file://" + arrPath[id]), "image/*");
                    startActivity(intent);
                }
            });
            holder.imageview.setImageBitmap(thumbnails[position]);
            holder.checkbox.setChecked(thumbnailsselection[position]);
            holder.id = position;
            return convertView;
        }
    }
    
    class ViewHolder {
        ImageView imageview;
        CheckBox checkbox;
        int id;
    }
    

    setLayoutParams 不是使行大小适应屏幕的义务。

    【讨论】:

    • 仍然无法正常工作,我尝试按照您在代码中的建议重新编写实现“BaseAdapter”的所有代码,但我只是一个只有标题行可见的白屏。我还使用 getSystemService(..) 而不是 getLayoutInflater() 修改了我的代码(我在 2 个代码之间看到的唯一区别),但结果是一样的:一切正常,但不会出现复选框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多