2012-03-10 49 views
0

我有自定义数组列表,它连接到我的数组列表的每一行的适配器和自定义XML。当点击项目时,我已经让字符串生成器警报,当我确认它时,我想更改自定义数组列表中显示的图像。到目前为止,我还没有能够以某种方式更新列表与选定项目的新图像。你知道吗,它是如何完成的?有什么方法可以跟踪,列表中的哪个位置被点击?恢复方法和某种“重绘”最佳解决方案?Android自定义阵列列表图像更新

感谢

编辑:增加了对适配器代码我使用:

public class datamanagerAdapter extends ArrayAdapter<mapObject>{ 
private ArrayList<mapObject> items; 
private Context ctx; 
String rememberName=""; 

public datamanagerAdapter(Context context, int textViewResourceId, ArrayList<mapObject> items) { 
    super(context, textViewResourceId, items); 
    this.items = items; 
    this.ctx = context; 
} 

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


     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.row, null); 
     } 
     final mapObject mo = items.get(position); 
     if (mo != null) { 
       ImageView imv = (ImageView) v.findViewById(R.id.selected); 
       TextView one = (TextView) v.findViewById(R.id.mapname); 
       TextView two = (TextView) v.findViewById(R.id.map_contains); 
       TextView three = (TextView) v.findViewById(R.id.map_size); 

       if (one != null) { 
         one.setText(""+mo.getMapName());        
       } 
       if(two != null){ 
         two.setText(""+ mo.getMapContains()); 
       } 
       if(three != null){ 
        three.setText("Size: "+ mo.getMapSize()+"MB  POI: "+mo.getMapContainsPoi()+""); 
       } 
       if (imv != null) { 
        imv.setImageDrawable(mo.getImage()); 
       }else{ 
        imv.setImageDrawable(v.getResources().getDrawable(R.drawable.cross)); 
       } 

       v.setOnClickListener(new OnClickListener() { 
        public void onClick(View arg0) { 

          showDetails(mo, ctx); 
        } 

        private void showDetails(final mapObject mo, final Context ctx) { 
         final Context mContext = ctx.getApplicationContext(); 
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE); 
         final View layout = inflater.inflate(R.layout.custom_dialog,null); 
         AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
         builder.setView(layout); 

         final AlertDialog alertDialog = builder.create(); 

         TextView l1=(TextView) layout.findViewById(R.id.lineone); 
         TextView l2=(TextView) layout.findViewById(R.id.linetwo); 
         TextView l3=(TextView) layout.findViewById(R.id.linethree); 
         TextView l4=(TextView) layout.findViewById(R.id.linefour); 
         TextView l5=(TextView) layout.findViewById(R.id.linefive); 
         TextView l6=(TextView) layout.findViewById(R.id.linesix); 
         TextView l7=(TextView) layout.findViewById(R.id.lineseven); 

         Button select=(Button) layout.findViewById(R.id.selectActiveMap); 
         Button cancel=(Button) layout.findViewById(R.id.closeWindowButton); 

         rememberName=mo.getMapName(); 

         l1.setText("..."); 
         l2.setText("Map: "+mo.getMapName()); 
         l3.setText("Covered Area: "+mo.getMapContains()); 
         l4.setText("Size: "+mo.getMapSize()+" MB"); 
         l5.setText("POI: "+mo.getMapContainsPoi()); 
         l6.setText("Source: "+mo.getMapSource()); 
         l7.setText("Version: "+mo.getMapVersion()); 

         select.setOnClickListener(new OnClickListener() { 

          @Override 
          public void onClick(View v) { 
          //here I want to change image which is displayed in the list. If I select this map, I ant to have displayed "tick" better than a "cross" which is used by default. 


           } 
           alertDialog.dismiss(); 



          } 
         }); 

         cancel.setOnClickListener(new OnClickListener() { 

          @Override 
          public void onClick(View v) { 
           alertDialog.dismiss(); 

          } 
         }); 





         alertDialog.show(); 
        } 
       }); 
     } 
     return v;  
} 

}

+0

发表您的适配器的代码。 – Luksprog 2012-03-10 17:50:16

+0

添加适配器代码 – Waypoint 2012-03-11 06:48:55

回答

1

getView()方法的代码是一个烂摊子,它的方法应该是简单的像这样:

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

      if (v == null) { 
       LayoutInflater vi = (LayoutInflater) ctx 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.stacktest3_row, null); 
      } 
      final mapObject mo = items.get(position); 
      if (mo != null) { 
       ImageView imv = (ImageView) v.findViewById(R.id.selected); 
       TextView one = (TextView) v.findViewById(R.id.mapname); 
       TextView two = (TextView) v.findViewById(R.id.map_contains); 
       TextView three = (TextView) v.findViewById(R.id.map_size); 

       if (one != null) { 
        one.setText("" + mo.getMapName()); 
       } 
       if (two != null) { 
        two.setText("" + mo.getMapContains()); 
       } 
       if (three != null) { 
        three.setText("Size: " + mo.getMapSize() + "MB  POI: " 
          + mo.getMapContainsPoi() + ""); 
       } 
       if (imv != null) { 
        imv.setImageDrawable(mo.getImage()); 
       } else { 
        imv.setImageDrawable(v.getResources().getDrawable(
          R.drawable.cross)); 
       } 

      } 
      return v; 
     } 

如果你想列表行点击侦听器,那么你将有t如果扩展ListActivity或者在ListView元素上设置setOnItemClickListener(),则执行方法onListItemClick(ListView l, View v, int position, long id),如果扩展为Activity。然后在onItemClick()方法:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    mapObject item = l.getItemAtPosition(position); 
      showDetails(item, context); //see what context you can use   
} 

然后在选择按钮:

select.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     //If you want to change the image then put your new image(or drawable or what ever) or id in the ITEM mapObject that you pass to the method showDetails() then call notifyDataSetChanged() on your adapter object 
     alertDialog.dismiss(); 
     } 
    }); 
+1

@Waypoint当您按下对话框中的选择按钮时,使用更改方法更改项目mapObject中的图像,然后调用:'adapterObject.notifyDataSetChanged()'。这将通知您的适配器数据已更改,并刷新列表以反映新的更改。 – Luksprog 2012-03-11 08:22:31

+0

多谢slukian! – Waypoint 2012-03-11 08:37:10