Проблемы с настройкой цвета фона элемента ListView - PullRequest
2 голосов
/ 18 марта 2012

У меня есть ListView, и когда пользователь нажимает на один из его элементов, я хочу, чтобы этот элемент стал синим.Для этого в методе onCreate() действия ListView я установил прослушиватель для пользовательских кликов.

m_listFile=(ListView)findViewById(R.id.ListView01);  
      m_listFile.setOnItemClickListener(new OnItemClickListener() {  

            public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {  
                arg0.getChildAt(arg2).setBackgroundColor(Color.BLUE);  
            }
});

Все отлично работает для первых видимых элементов, но когда я прокручиваю список, у меня появляется NullPointerException в arg0.getChildAt(arg2).setBackgroundColor(...), даже если значение arg2 имеет правильную позицию индекса элемента,

Мой ListView имеет структуру из двух строк, когда я загружаю ListView Я использую этот адаптер:

 SimpleAdapter sa = new SimpleAdapter(
            getApplicationContext(), 
            expsList, 
            R.layout.listelement, 
            new String[] { "screen_name","text" },
            new int[] { R.id.Name, R.id.Value}) {

      };

      m_listFile.setAdapter(sa);

Я не понимаю, как решить эту проблему.Могу ли я получить помощь?

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Вы можете расширить SimpleAdapter следующим образом:

private class MyAdapter extends SimpleAdapter {

        public MyAdapter(Context context, List<? extends Map<String, ?>> data,
                int resource, String[] from, int[] to) {
            super(context, data, resource, from, to);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView,   parent);
            v.setBackgroundColor(Color.BLACK); //or whatever is your default color
              //if the position exists in that list the you must set the background to BLUE
          if(pos!=null){
            if (pos.contains(position)) {
                v.setBackgroundColor(Color.BLUE);
            }
          }
            return v;
        }

    }

Затем в своей деятельности добавьте поле, подобное этому:

//this will hold the cliked position of the ListView
ArrayList<Integer> pos = new ArrayList<Integer>();

и установите адаптер:

sa = new MyAdapter(
            getApplicationContext(), 
            expsList, 
            R.layout.listelement, 
            new String[] { "screen_name","text" },
            new int[] { R.id.Name, R.id.Value}) {

      };
m_listFile.setAdapter(sa);

При нажатии на строку:

    public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {  
                    // check before we add the position to the list of clicked positions if it isn't already set
                if (!pos.contains(position)) {
                pos.add(position); //add the position of the clicked row
            }
        sa.notifyDataSetChanged(); //notify the adapter of the change       
}
0 голосов
/ 18 марта 2012

Полагаю, вам следует использовать

arg0.getItemAtPosition(arg2).setBackgroundColor(Color.BLUE);

вместо

arg0.getChildAt(arg2).setBackgroundColor(Color.BLUE);

, как сказано в Справочнике разработчика Android здесь

...