我想通过左右按键切换,实现YES 和 NO 的切换。下面是我的实现,当然还没有实现,编译没有错大家能给我点提示吗?
package com.hzg.listviewexemple;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;public class MainActivity extends Activity {
 private ListView mListView;
 private List<Map<String, Object>> data;
 private ArrayAdapter<String> adapter;  
private static final String[] m = { "YES", "NO" };  
 
@Override
public void onCreate(Bundle savedInstanceStated) {
super.onCreate(savedInstanceStated);
setContentView(R.layout.list_view);
data = getData();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, m);
mListView = (ListView) findViewById(R.id.list_view_id);
mListView.setAdapter(new CustomListAdapter(this));
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:// 按向左键
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:// 按向右键
break;
default:
break;
} return super.onKeyDown(keyCode, event);
} private List<Map<String, Object>> getData()
    {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map;
        for(int i=0;i<5;i++)
        {
            map = new HashMap<String, Object>();
            map.put("menuText", "Menu List");
            map.put("menuImage", R.drawable.gray_l);
            map.put("rightOfImage", R.drawable.gray_r);
            list.add(map);
        }
        return list;
    }

class CustomListAdapter extends BaseAdapter {
 private LayoutInflater mInflater;
 private Context mContext = null;

public CustomListAdapter(Context context) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
} public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
} public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} public int getCount() {
// TODO Auto-generated method stub
return data.size();
} public View getView(int position, View convertView, android.view.ViewGroup parent) {
final ViewHolder viewHolder; if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item_custom, null); viewHolder.menuImage= (ImageView) convertView.findViewById(R.id.menu_image_id);
viewHolder.rightOfImage= (ImageView) convertView.findViewById(R.id.right_image_id);
viewHolder.menuText = (TextView) convertView.findViewById(R.id.menu_text_id); viewHolder.choiceText = (TextView) convertView.findViewById(R.id.choice_text_id);
convertView.setTag(viewHolder);

else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.menuText.setText((String) data.get(position).get("menuText"));
viewHolder.menuImage.setBackgroundResource((Integer) data.get(position).get("menuImage"));
viewHolder.rightOfImage.setBackgroundResource((Integer) data.get(position).get("rightOfImage"));
viewHolder.choiceText.onKeyDown(position, null);
return convertView;
}
public class ViewHolder {
public TextView menuText;
public ImageView menuImage;
public TextView choiceText;
public ImageView rightOfImage;
}
}
}

解决方案 »

  1.   

    listview里面的视图肯定是要根据数据来的,肯定有个数组,每个item也肯定有Yes/no的属性,你onkeydown的时候改变这个数组的item的属性,然后刷新列表不就可以了吗?不知道android能不能只刷新一行数据
      

  2.   

    首先你要在data中保存当前是yes还是no,在getview中viewHolder.choiceText.setText((String) data.get(position).get("choiceText"));
    然后在按键的事件处理中来修改data中保存的值(是yes就改为no,no就改为yes)。但是有个问题是,当按键时你怎么知道你修改的是哪一条呢。建议通过点击yes/no左右的箭头来切换更好
      

  3.   


    改成这样后,似乎没有进入onKey里面执行,这是为什么 呢?package com.hhb.listviewexemple;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnKeyListener;
    import android.view.animation.AnimationUtils;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemSelectedListener;
    import android.widget.ArrayAdapter;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.Spinner;
    import android.widget.TextSwitcher;
    import android.widget.TextView;public class MainActivity extends Activity {
     private ListView mListView;
     private List<Map<String, Object>> data;
     private ArrayAdapter<String> adapter;  
    private static final String[] m = { "YES", "NO" };  
     
    @Override
    public void onCreate(Bundle savedInstanceStated) {
    super.onCreate(savedInstanceStated);
    setContentView(R.layout.list_view);
    data = getData();
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, m);
    mListView = (ListView) findViewById(R.id.list_view_id);
    mListView.setAdapter(new CustomListAdapter(this));
    } private List<Map<String, Object>> getData()
        {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map;
        
    map = new HashMap<String, Object>();
    map.put("menuText", "Service Lock");
    map.put("menuImage", R.drawable.gray_l);
    map.put("rightOfImage", R.drawable.gray_r);
    list.add(map);
            
            map = new HashMap<String, Object>();
            map.put("menuText", "Installation Lock");
            map.put("menuImage", R.drawable.gray_l);
            map.put("rightOfImage", R.drawable.gray_r);
            list.add(map);
            return list;
        }

    class CustomListAdapter extends BaseAdapter {
     private LayoutInflater mInflater;
     private Context mContext = null;

    public CustomListAdapter(Context context) {
    mContext = context;
    mInflater = LayoutInflater.from(mContext);
    } public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
    } public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
    } public int getCount() {
    // TODO Auto-generated method stub
    return data.size();
    } public View getView(int position, View convertView, android.view.ViewGroup parent) {
    final ViewHolder viewHolder;
    // adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    if (convertView == null) {
    viewHolder = new ViewHolder();
    convertView = mInflater.inflate(R.layout.item_custom, null); viewHolder.menuImage= (ImageView) convertView.findViewById(R.id.menu_image_id);
    viewHolder.rightOfImage= (ImageView) convertView.findViewById(R.id.right_image_id);
    viewHolder.menuText = (TextView) convertView.findViewById(R.id.menu_text_id);
    // viewHolder.mSpinner = (Spinner) convertView.findViewById(R.id.menu_spinner_id);
    viewHolder.choiceText = (TextView) convertView.findViewById(R.id.choice_text_id);

    convertView.setTag(viewHolder);

    else {
    viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.menuText.setText((String) data.get(position).get("menuText"));
    viewHolder.menuImage.setBackgroundResource((Integer) data.get(position).get("menuImage"));
    viewHolder.rightOfImage.setBackgroundResource((Integer) data.get(position).get("rightOfImage"));
    viewHolder.choiceText.setOnKeyListener(new OnKeyListener(){
    public boolean onKey(View v, int keyCode, KeyEvent event) {
    System.out.println("YYYYYYYY");
    // TODO Auto-generated method stub
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:// 按向左键
    viewHolder.choiceText.setText("Y");
    System.out.println("AAAAA");
    break;
    case KeyEvent.KEYCODE_DPAD_RIGHT:// 按向右键
    viewHolder.choiceText.setText("N");
    System.out.println("HHHH");
    break;
    default:
    break;
    }
    return false;
    }
    }); return convertView;
    } public class ViewHolder {
    public TextView menuText;
    public ImageView menuImage;
    // public Spinner mSpinner;
    public TextView choiceText;
    public ImageView rightOfImage;
    }
    }
    }
      

  4.   

    应该是焦点的问题,试一下这样
            mListView.setOnKeyListener(new OnKeyListener()
    {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
                    System.out.println("FFFFFFFFFF     " + mListView.getSelectedItemPosition());
    return false;
    }
    });
    这个是可以执行到的,然后根据当前选择的是第几个来具体操作
      

  5.   


    package com.hzg.listviewexemple;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnKeyListener;
    import android.widget.ArrayAdapter;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;public class MainActivity extends Activity {
     private ListView mListView;
     private List<Map<String, Object>> data;
     private ArrayAdapter<String> adapter;  
    private static final String[] m = { "YES", "NO" };  
     
    @Override
    public void onCreate(Bundle savedInstanceStated) {
    super.onCreate(savedInstanceStated);
    setContentView(R.layout.list_view);
    data = getData();
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, m);
    mListView = (ListView) findViewById(R.id.list_view_id);
    mListView.setAdapter(new CustomListAdapter(this));
    } private List<Map<String, Object>> getData()
        {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map;
            for(int i = 0;i < 2;i++)
            {
         map = new HashMap<String, Object>();
         map.put("menuText", "Service Lock");
         map.put("menuImage", R.drawable.gray_l);
         map.put("rightOfImage", R.drawable.gray_r);
         list.add(map);
            }
            
            return list;
        }
      
    class CustomListAdapter extends BaseAdapter {
     private LayoutInflater mInflater;
     private Context mContext = null;

    public CustomListAdapter(Context context) {
    mContext = context;
    mInflater = LayoutInflater.from(mContext);
    }
    public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
    }
    public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
    }

    public int getCount() {
    // TODO Auto-generated method stub
    return 2;
    }

    public View getView(final int position, View convertView, android.view.ViewGroup parent) {
    final ViewHolder viewHolder;
    adapter.setDropDownViewResource(android.R.layout.list_content);
      
    if (convertView == null) {
    viewHolder = new ViewHolder();
    convertView = mInflater.inflate(R.layout.item_custom, null); viewHolder.menuImage= (ImageView) convertView.findViewById(R.id.menu_image_id);
    viewHolder.rightOfImage= (ImageView) convertView.findViewById(R.id.right_image_id);
    viewHolder.menuText = (TextView) convertView.findViewById(R.id.menu_text_id);
    // viewHolder.mSpinner = (Spinner) convertView.findViewById(R.id.menu_spinner_id);
    viewHolder.choiceText = (TextView) convertView.findViewById(R.id.choice_text_id);

    convertView.setTag(viewHolder);

    else {
    viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.menuText.setText((String) data.get(position).get("menuText"));
    viewHolder.menuImage.setBackgroundResource((Integer) data.get(position).get("menuImage"));
    viewHolder.rightOfImage.setBackgroundResource((Integer) data.get(position).get("rightOfImage"));
    mListView.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    // int itemPosition = mListView.getSelectedItemPosition();
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:// 按向左键
    System.out.println("Hello "+position);
    // System.out.println("left position:"+ mListView.getSelectedItemPosition());
    if(position == 0) viewHolder.choiceText.setText("1");
    if(position == 1) viewHolder.choiceText.setText("3");

    break;
    case KeyEvent.KEYCODE_DPAD_RIGHT:// 按向右键
    // viewHolder.choiceText.setText((String)data.get(position).get("choiceText"));
    System.out.println("right position:"+ mListView.getSelectedItemPosition());
    if(position == 0) viewHolder.choiceText.setText("2");
    if(position == 1) viewHolder.choiceText.setText("4");
    break;
    }
    return false;
    }
    });

    return convertView;
    } public class ViewHolder {
    public TextView menuText;
    public ImageView menuImage;
    public TextView choiceText;
    public ImageView rightOfImage;
    }
    }
    }if(position == 0) viewHolder.choiceText.setText("1");
    if(position == 0) viewHolder.choiceText.setText("2");这两句不会执行,没有在第0条item里面指印数字
      

  6.   


    viewHolder.choiceText.setOnKeyListener(new OnKeyListener() {

    public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    // int itemPosition = mListView.getSelectedItemPosition();
    System.out.println("111111111111111");
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:// 按向左键
    System.out.println("Hello "+position);
    System.out.println("left position:"+ mListView.getSelectedItemPosition());
    if(position == 0) viewHolder.choiceText.setText("1");
    if(position == 1) viewHolder.choiceText.setText("3");

    break;
    case KeyEvent.KEYCODE_DPAD_RIGHT:// 按向右键
    // viewHolder.choiceText.setText((String)data.get(position).get("choiceText"));
    System.out.println("right position:"+ mListView.getSelectedItemPosition());
    if(position == 0) viewHolder.choiceText.setText("2");
    if(position == 1) viewHolder.choiceText.setText("4");
    break;
    }
    return false;
    }
    });改成这样又没有字符显示!要崩溃了
      

  7.   

    问题出在mListView.setOnKeyListener,这个在adapter中调用会调用两次,第一次position为0,第二次position为1会导致之前的listener失效,所有position==0永远不会执行,应该把mListView.setOnKeyListener放到adapter外面,而且应该根据mListView.getSelectedItemPosition()来判断位置
      

  8.   

    索性把我的测试代码贴上来
    public class Test2Activity extends Activity {
         private ListView mListView;
         private List<Map<String, Object>> data;
         private ArrayAdapter<String> adapter;  
         
         CustomListAdapter listAdapter;
        private static final String[] m = { "YES", "NO" };  
         
        @Override
        public void onCreate(Bundle savedInstanceStated) {
            super.onCreate(savedInstanceStated);
            setContentView(R.layout.list_view);
            data = getData();
            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, m);
            mListView = (ListView) findViewById(R.id.list_view_id);
            
            listAdapter = new CustomListAdapter(this);
            mListView.setAdapter(listAdapter);
            
            mListView.setOnKeyListener(new OnKeyListener()
    {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
                    System.out.println("FFFFFFFFFF     " + mListView.getSelectedItemPosition());
                    
                    int pos = mListView.getSelectedItemPosition();
                    
                    if (pos >= 0)
                    {
                    int i = 0;
                    
                    if (event.getAction() == KeyEvent.ACTION_UP)
                    {
                    switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_LEFT:// 按向左键
                     i = (Integer) data.get(pos).get("sss");
                    
                     data.get(pos).put("sss", i - 1);
                    
                     listAdapter.notifyDataSetChanged();
                    
                     return true;

                    case KeyEvent.KEYCODE_DPAD_RIGHT:// 按向右键
                     i = (Integer) data.get(pos).get("sss");
                    
                     data.get(pos).put("sss", i + 1);

                     listAdapter.notifyDataSetChanged();
                    
                     return true;
                    }
                    }
                    }
    return false;
    }
    });    }    private List<Map<String, Object>> getData()
        {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map;
            for(int i = 0;i < 2;i++)
            {
                map = new HashMap<String, Object>();
                map.put("menuText", "Service Lock");
                //map.put("menuImage", R.drawable.gray_l);
               // map.put("rightOfImage", R.drawable.gray_r);
                map.put("sss", 1);
                list.add(map);
            }
             
            return list;
        }
        
        class CustomListAdapter extends BaseAdapter {
             private LayoutInflater mInflater;
             private Context mContext = null;
            
            public CustomListAdapter(Context context) {
                mContext = context;
                mInflater = LayoutInflater.from(mContext);
            }        public Object getItem(int arg0) {
                // TODO Auto-generated method stub
                return arg0;
            }        public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }        public int getCount() {
                // TODO Auto-generated method stub
                return data.size();
            }        public View getView(int position, View convertView,    android.view.ViewGroup parent) {
                final ViewHolder viewHolder;
    //            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                if (convertView == null) {
                    viewHolder = new ViewHolder();
                    convertView = mInflater.inflate(R.layout.item_custom, null);                viewHolder.choiceText = (TextView) convertView.findViewById(R.id.choice_text_id);
                    
                    convertView.setTag(viewHolder);
                } 
                else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }            int i = (Integer) data.get(position).get("sss");
                
                viewHolder.choiceText.setText(String.valueOf(i));            return convertView;
            }    public class ViewHolder {
            public TextView menuText;
            public ImageView menuImage;
    //        public Spinner mSpinner;
            public TextView choiceText;
            public ImageView rightOfImage;
        }
        }
    }
      

  9.   


    嗯,谢谢!数字可以切换,但是切换YES或NO还有问题!
      

  10.   

    那把TextView能不能换成Spinner啊??