繁体   English   中英

在Android的listView的特定行中添加ImageView

[英]Add the ImageView in specific row of listView in android

这是我的适配器类,其中有我在类中清除的子视图,现在我需要在同一适配器类中的某个特定行上添加图像,假设有任何方法可以在某个特定行上添加图像在同一适配器类中的列表的第10行?

 public class abc extends BaseAdapter {
  private static final int TYPE_ITEM = 0;
  private static final int TYPE_SEPARATOR = 1;
  ArrayList<ListData> myList = new ArrayList<ListData>();
  ArrayList<rowData> details = new ArrayList<rowData>();
  ArrayList<Integer> imagePosition = new ArrayList<Integer>();
  LayoutInflater inflater;
  Context context;  

public abc(Context context, ArrayList<ListData> myList)
{ 
    this.myList = myList; 
    this.context = context; 
    setImageViewPosition(10);
    notifyDataSetChanged();
    inflater = LayoutInflater.from(this.context); 
// only context can also be used 
} 
@Override public int getCount() { 
    return myList == null ? 0 : myList.size(); 
    } 
@Override public ListData getItem(int position) {
    return myList.get(position);
    }  
@Override public long getItemId(int position) { 
    return this.myList.get(position).getViewType();
    }  
@Override public View getView(int position, View convertView, ViewGroup parent) { 
    MyViewHolder mViewHolder;


        int type = getItemViewType(position);

   if (convertView == null) {
       mViewHolder = new MyViewHolder();
           switch (type) {
               case TYPE_ITEM:
                   convertView = inflater.inflate(R.layout.beacon_room_list_item1, null);
                   break;
               case 1:
                   convertView = inflater.inflate(R.layout.beacon_item_0_to_15, null);
                   break;
               case 2:
                   convertView = inflater.inflate(R.layout.beacon_item_0_to_30, null);
                   break;
               case 3:
                   convertView = inflater.inflate(R.layout.beacon_item_0_to_45, null);
                   break;
               case 4:
                   convertView = inflater.inflate(R.layout.beacon_item_0_to_60, null);
                   break;
               case 5:
                   convertView = inflater.inflate(R.layout.beacon_item_15_to_30, null);
                   break;
               case 6:
                   convertView = inflater.inflate(R.layout.beacon_item_15_to_45, null);
                   break;
               case 7:
                   convertView = inflater.inflate(R.layout.beacon_item_15_to_60, null);
                   break;
               case 8:
                   convertView = inflater.inflate(R.layout.beacon_item_30_to_45, null);
                   break;
               case 9:
                   convertView = inflater.inflate(R.layout.beacon_item_30_to_60, null);
                   break;
               case 10:
                   convertView = inflater.inflate(R.layout.beacon_item_45_to_60, null);
                   break;
           }
       convertView.setTag(mViewHolder);
           } else {
               mViewHolder = (MyViewHolder)convertView.getTag();
           }

   switch (type) {
   case TYPE_ITEM:
        mViewHolder.startDate = detail(convertView, R.id.datetitle, myList.get(position).getTitle());
       break;
   case TYPE_SEPARATOR:
   case 2:
   case 3:
   case 4:
   case 5:
   case 6:
   case 7:
   case 8:
   case 9:
   case 10:
   case 11:
       mViewHolder.startDate = detail(convertView, R.id.datetitle, myList.get(position).getTitle());
       mViewHolder.organiser = detail(convertView, R.id.organiser, myList.get(position).organiser);
       break;
   }
   for(Integer i : imagePosition)
   {
      if(i == position)
      {
          ImageView imgView = (ImageView) convertView.findViewById(R.id.meetingline);
          mViewHolder.ivIcon =imgView;
          notifyDataSetChanged();
      }
   }
    return convertView; 
    }

@Override
public int getViewTypeCount() {
    return 12;
}

@Override
public int getItemViewType(int position) {

    return this.myList.get(position).getViewType();

    /*
    if(this.myList.get(position).getorganiser().equalsIgnoreCase(""))
    {
        return TYPE_ITEM;
    }
    else
    {
        return TYPE_SEPARATOR;
    }*/
}


// or you can try better way
private TextView detail(View v, int resId, String text) {
    TextView tv = (TextView) v.findViewById(resId);

    if(tv != null )
        tv.setText(text); 

    return tv;
    }  
private ImageView details(View v, int resId, int icon) {
    ImageView iv = (ImageView) v.findViewById(resId);
    iv.setImageResource(icon);
    return iv;
    } 
private class MyViewHolder {
    TextView startDate,calendar,organiser; 
//  View v = findViewById(R.id.our_view); 

    // Get params:

    ImageView ivIcon;
    } 

public void setImageViewPosition(int position)
{
   imagePosition.add(position);
}
}

您可以做的是将imageview添加到行xml文件中,并使其不可见,如下所示:

<ImageView
        android:id="@+id/myImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

然后,当您希望显示该ImageView时,可以在Base Adapter类中执行以下操作:

ImageView imgView = (ImageView)findViewById(R.id.myImageView);
imgView .setVisibility(View.VISIBLE);

您可以在getView()方法中添加条件,如果位置为10,则可以设置或构造ImageView。只需要确保在为图像视图之后的位置构造视图时考虑到该位置已被填充。

private int imageViewPosition = 10;

@Override
public View getView(final int pos, final View convertView, final ViewGroup parent) {

    if (pos == imageViewPosition) {
        // you should construct and return your image view
    }

    int position = pos;
    if (pos > imageViewPosition) {
        position = pos - 1;
    }

    // construct stuff for position
}

您还需要更改任何其他适配器方法以解决(a)额外视图和(b)额外视图之后的位置变化,例如getItem(),getCount()等。

您的ListView将如下所示:

view 1: stuff for position 1
view 2: stuff for position 2
...
view 9: stuff for position 9
view 10: your inserted imageview 
view 11: stuff for position 10

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM