如何添加取决于ListView中TextView文本的ImageView的

问题描述:

我有一个自定义ListView,其中RowItem包含TextViewImageView。 将动态添加RowItems如何添加取决于ListView中TextView文本的ImageView的

我只是想知道如何将ImageView添加到TextView中的特定文本。

因此,如果在TextView代表“标题1”,ImageView“R.drawable.ic_title1”应该被添加到RowItem


这里是我的代码

class SessionItemAdapter extends ArrayAdapter<Map> { 

     final ArrayList<Map> values; 
     Context context; 

     SessionItemAdapter(Context context, ArrayList<Map> values) { 
      super(context, R.layout.session_list_layout_row, values); 
      this.values = values; 
      this.context = context; 
     } 


     @Override 
     public View getView(final int position, View view, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View rowView = inflater.inflate(R.layout.session_list_layout_row, parent, false); 

      TextView tv = (TextView) rowView.findViewById(R.id.stepTime); 
      final int rowId = (Integer) values.get(position).get("id"); 
      int beepStringId = getResources().getIdentifier("exercise_typ_" + values.get(position).get("type"), "string", getPackageName()); 

      rowView.setTag(rowId); 

      tv.setText(getResources().getString(beepStringId)); 
      ImageView image =(ImageView) rowView.findViewById(R.id.imageView2); 


       switch(position){ 

       case 1 : image.setImageResource(R.drawable.ic_title1); 
        break; 

       case 2 : image.setImageResource(R.drawable.ic_title2); 
        break; 
      } 

      ImageButton deleteSession = (ImageButton) rowView.findViewById(R.id.session_item_del); 
      deleteSession.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        /*if (!startStopToggle.isChecked()) {*/ 
        sessionAdapter.remove(values.get(position)); 
        sessionAdapter.notifyDataSetChanged(); 


       } 
      }); 

      return rowView; 
     } 

     //in your adapter getAllPlayers() would be something like this 
     public List<String> getAllPlayers() { 
      List<String> list = new ArrayList<String>(); 
      for (Map item : values) { 
       int beepStringId = context.getResources().getIdentifier("exercise_typ_" 
         + item.get("type"), "string", context.getPackageName()); 
       String str = context.getResources().getString(beepStringId); 
       list.add(str); 
      } 
      return list; 
     } 


    } 

我与Switch声明试图将其与position但只设置ImageViewRowItem是上的位置多数民众赞成写在case

,您可以根据对TextView的文本switch-case语句像下面

switch(tv.getText().toString()){ 

       case "Title1" : image.setImageResource(R.drawable.ic_title1); 
        break; 

       case "Title2" : image.setImageResource(R.drawable.ic_title2); 
        break; 

       default: 
        //Default image here, if no case found 
       break; 
} 

注:上面的回答需要JRE 1.7遵守

什么这样的事情。

image.setImageResource(getImageId(this, "ic_" + tv.getText().toString().toLowerCase()); 

所以基本上你得到从操纵它是在你存储你的图像格式的文本视图中的标题和调用下面的助手,以获得正确的图片ID。

public static int getImageId(Context context, String imageName) { 
    return context.getResources().getIdentifier("drawable/" + imageName, null, context.getPackageName()); 
} 

在这种情况下的解决办法是添加方法用于获取和设置各个字段为您ListView对象。例如,因为你有一个TextView和您的行项目ImageView,让我们假设你的行对象看起来像下面这样:

public class ListObject 
{ 

    public ListObject (String textView, String imageView) 
    { 
     super(); 
     this.textView      = textView; 
     this.imageView      = imageView; 
    } 

    private String  textView; 
    private String  imageView; 

    public String getTextView() 
    { 
     return textView; 
    } 

    public void setTextView (String pTextView) 
    { 
     this.textView = pTextView; 
    } 

    public String getImageView() 
    { 
     return imageView; 
    } 

    public void setImageView (String pImageView) 
    { 
     this.imageView = pImageView; 
    } 
} 

一旦这些实现,你可以很容易地设置基于ImageViewTextView像这样:

// As an example, let us use the first list item 
ListObject listObject = (ListObject) parent.getItemAtPosition(0); 

if (listObject.getTextView == "Title1") 
{ 
    listObject.setImageView("NameOfResource"); 
} 
// so on and so forth 
+0

为什么要实现一个全新的对象?所有的数据已经在适配器中。 – Marcus 2015-01-26 22:04:38