Как изменить только одну строку за раз в Listview?

1

Я пытаюсь найти решение для следующей перечисленной проблемы. У меня есть Listview сгенерированный с помощью Simpleadapter. Когда я нажимаю на строку в списке, я хочу создать макет с colorful цветом. Я могу это сделать. Но моя проблема начинается здесь. Когда я нажимаю на другую строку, скажем, номер строки 5, отображается яркая раскладка, но макет также отображается и для ранее щелкнутой строки. То, что я хочу сделать, - сделать макет красочным видимым только для щелкнутой строки (т.е. Он должен быть видимым только для одной строки за раз, т.е. в данный момент нажата строка и скрыта для всех остальных строк), и макет должен стать невидимым для ранее щелкнул строки. Я пробовал делать с viewholder но это не помогает. Ниже приведен фрагмент кода. Направляйте меня шаг за шагом, поскольку я очень новичок в Android.

           final BaseAdapter k=new SimpleAdapter(getActivity(),val,R.layout.mytaskdata,new String[]{"sname","heading","desc","id","path","receiver","sender"},new int[]{R.id.textView1,R.id.textView2,R.id.textView3,R.id.hide1,R.id.hide2,R.id.hide3,R.id.hide4})
      {

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            final View v = super.getView(position, convertView, parent);
            TextView myname=(TextView)v.findViewById(R.id.textView1);
            TextView mydes=(TextView)v.findViewById(R.id.textView2);
            TextView mytopic=(TextView)v.findViewById(R.id.textView3);
            ImageView edit=(ImageView)v.findViewById(R.id.ImageView03);
            sent.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                    RelativeLayout r=(RelativeLayout)arg1.findViewById(R.id.colorful);
                //  r.setVisibility(arg1.VISIBLE);
                    int temp=sent.getCheckedItemPosition();
                    Log.i("itemposition",""+temp);

                    Toast.makeText(getActivity(),"pos"+arg2+"hii"+positionThatSaysHi,1000).show();
                    if(arg2!=positionThatSaysHi)
                    {
                        r.setVisibility(arg1.VISIBLE);
                        positionThatSaysHi = arg2;
                        notifyDataSetChanged();
                    }
                    else
                    {
                        r.setVisibility(arg1.GONE);
                         notifyDataSetChanged();
                    }
            });
Теги:
listview
simpleadapter

2 ответа

0
Лучший ответ

Я бы предложил изменить OnClickListener чтобы просто записать выбранную строку, а затем вызвать notifyDataSetChanged(). Это приведет к тому, что ListView будет перерисовывать свои элементы, вызвав адаптер. Поэтому вам просто нужно проверить это значение в getView() чтобы определить, должно ли "красочное" представление быть видимым или нет.

Таким образом, обновленный код будет выглядеть примерно так:

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    final View v = super.getView(position, convertView, parent);
    TextView myname=(TextView)v.findViewById(R.id.textView1);
    TextView mydes=(TextView)v.findViewById(R.id.textView2);
    TextView mytopic=(TextView)v.findViewById(R.id.textView3);
    ImageView edit=(ImageView)v.findViewById(R.id.ImageView03);

    RelativeLayout r = (RelativeLayout)v.findViewById(R.id.colorful)            
    r.setVisibility(position == positionThatSaysHi ? View.VISIBLE : View.GONE);

    sent.setOnItemClickListener(new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
        {
            positionThatSaysHi = arg2;
            notifyDataSetChanged();
        }
    });
}

Таким образом, вы убедитесь, что будет выделено только одно представление (в то же время упростив ваш код).

  • 0
    Большое спасибо .. Это действительно сработало.
0

Воспользуйтесь режимом выбора в ListView (см. SetChoiceMode()) и установите его в CHOICE_MODE_SINGLE.

Используйте режим выбора, чтобы переключить видимость вашей красочной компоновки. Если возможно, самый простой способ сделать это - иметь яркие биты в выделенном селекторе, с выбранным = true. Таким образом он будет автоматически отображаться, и вам не нужно беспокоиться о том, чтобы скрывать и показывать виды.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню