2014-11-06 50 views
-1

我正在致力于BaseAdapter。我写了一些代码,可以用baseAdapterlistview中显示图像和文本。现在我想按位置更改图像和文字背景。Android listview setOnItemClickListener通过开关按位置更改图像背景

这是我baseAdapter代码

public class SlideMenuAdapter extends BaseAdapter { 
    private Context mContext; 
    private final String[] menu_items_id; 

    private final int[] Imageid; 
    TextView textView; 
    ImageView imageView; 

    private static LayoutInflater inflater = null; 

    public SlideMenuAdapter(Context context, String[] names, int[] Imageid) 
      { 
     mContext = context; 

     this.Imageid = Imageid; 
     this.menu_items_id = names; 
     inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 

     return Imageid.length; 
    } 

    @Override 
    public Object getItem(int position) { 

     return null; 
    } 

    @Override 
    public long getItemId(int position) { 

     return 0; 
    } 

    @SuppressLint("ViewHolder") 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View grid; 

     grid = new View(mContext); 
     grid = inflater.inflate(R.layout.azercell_slidemenu_adaper, null); 
     textView = (TextView) grid.findViewById(R.id.desc); 
     imageView = (ImageView) grid.findViewById(R.id.photo); 

     textView.setText(menu_items_id[position]); 





     imageView.setImageResource(Imageid[position]); 
     return grid; 
    } 
} 

,这是我的列表视图监听器代码

listView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      TextView textView1 = (TextView) parent.findViewById(R.id.desc); 
      ImageView imageView=(ImageView)parent.findViewById(R.id.photo); 
      switch (position) { 
      case 0: 
       textView1.setTextColor(Color.parseColor("#8f332a")); 
       imageView.setImageResource(menu_imagesover[position]); 
       break; 

      case 1: 
       textView1.setTextColor(Color.parseColor("#ffffff")); 
       imageView.setImageResource(menu_imagesover[position]); 
       break; 

      default: 
       break; 
      } 



     } 

    }); 




int[] menu_imagesover = { R.drawable.schedule_ove, R.drawable.about_over, 
     R.drawable.booking_over }; 

当我在列表视图中单击我只能改变第一项的图像和文本的背景。我如何写代码可以改变每个项目的位置?

回答

0

试图调用invalidate方法刷新listview

 switch (position) { 
     case 0: 
      textView1.setTextColor(Color.parseColor("#8f332a")); 
      imageView.setImageResource(menu_imagesover[position]); 
      break; 

     case 1: 
      textView1.setTextColor(Color.parseColor("#ffffff")); 
      imageView.setImageResource(menu_imagesover[position]); 
      break; 

     default: 
      break; 
     } 
     invalidate(); //add here 

或者,如果它不工作,尝试调用invalidateViews,而不是invalidate

而且我认为这些关于switch (position)的东西有点可疑,是不是意味着你的代码只有在第一行和第二行被点击时才会起作用?

+0

@我点击监听只工作第一项点击,而不是第二项等... – viviano 2014-11-06 14:09:58

0

用的Hashmap采取ArrayList中持有的列表项的所有信息:特定列表项的

ArrayList<HashMap<String,Object>> listData = new ArrayList<HashMap<String, Object>>(); 
HashMap<String,Object> row1 = new HashMap<String, Object>(); 
row1.put("name","item1"); 
row1.put("normalImage",R.drawable.ic_launcher); 
row1.put("selectedImage",R.drawable.ic_launcher); 
row1.put("normalTextColor","#000000"); 
row1.put("selectedTextColor","#ff0000"); 
row1.put("isClick",false); 
listData.add(row1); 
SlideMenuAdapter adapter = new SlideMenuAdapter(context,listData); 

更改状态单击

listView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
     if((Boolean)listData.get(position).get("isClick")){ 
      listData.get(position).put("isClick",false); 
     }else{ 
      listData.get(position).put("isClick",true); 
     } 
     adapter.notifyDataSetChanged(); 
    } 
}); 

检查项目点击状态getView()适配器:

public class SlideMenuAdapter extends BaseAdapter { 
    private Context context; 
    private ArrayList<HashMap<String,Object>> data; 

    public SlideMenuAdapter(Context context, ArrayList<HashMap<String,Object>> data) 
    { 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return data.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if(convertView==null){ 
      holder = new ViewHolder(); 
      convertView = LayoutInflater.from(context).inflate(R.layout.azercell_slidemenu_adaper, null); 
      holder.textView = (TextView) convertView.findViewById(R.id.desc); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.photo); 

      convertView.setTag(holder); 
     }else{ 
      holder =(ViewHolder) convertView.getTag(); 
     } 

     holder.textView.setText(data.get(position).get("name").toString()); 
     if((Boolean)data.get(position).get("isClick")){ 
      holder.textView.setTextColor(Color.parseColor(data.get(position).get("selectedTextColor").toString())); 
      holder.imageView.setImageResource((Integer)data.get(position).get("selectedImage")); 
     }else{ 
      holder.textView.setTextColor(Color.parseColor(data.get(position).get("normalTextColor").toString())); 
      holder.imageView.setImageResource((Integer)data.get(position).get("normalImage")); 
     } 

     return convertView; 
    } 

    class ViewHolder{ 
     TextView textView; 
     ImageView imageView; 
    } 
} 
+0

谢谢b我有3个图像和文本,例如,如果我点击第二个项目,那么我必须改变只有第二个图像等...... – viviano 2014-11-06 14:11:30

+0

请在ArrayList中添加为列表项目数据的数量在这里我只使用一个项目是row1 HashMap,因此您可以将row2,row3等作为不包含所有其他东西已在适配器中处理的列表项。 – 2014-11-06 14:24:12