【问题标题】:Android listview setOnItemClickListener change image background by position by switchAndroid listview setOnItemClickListener 通过开关按位置更改图像背景
【发布时间】:2014-11-06 12:53:46
【问题描述】:

我正在处理BaseAdapter。我写了一些代码,可以在listviewbaseAdapter 中显示图像和文本。现在我想按位置更改图像和文本背景。

这是我的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 };

当我单击列表视图时,我只能更改第一项的图像和文本背景。如何编写代码以按位置更改每个项目?

【问题讨论】:

    标签: android android-listview baseadapter onitemclicklistener


    【解决方案1】:

    尝试调用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) 有一些可疑之处,这是否意味着您的代码只有在单击第一行和第二行时才能工作?

    【讨论】:

      【解决方案2】:

      使用 ArrayList 和 Hashmap 来保存列表项的所有信息:

      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;
          }
      }
      

      【讨论】:

      • 谢谢,但我有 3 张图片和文字,例如,如果我点击第二个项目,那么我必须只更改第二张图片等......
      • 请在此处添加 ArrayList 中的列表项数据,我只使用一项,即 row1 HashMap,因此您可以将 row2、row3 等作为没有列表项,所有其他事情已经在适配器中处理.
      猜你喜欢
      • 2011-06-21
      • 2020-11-12
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多