Создание кастомного адаптера Android — ошибка

232
14 марта 2017, 13:12

Не могу понять как делать кастомный адаптер. Вот попробовал сделать как понял, но выходит ошибка при запуске приложения! Layout'ов 2 — в одном ListView, а в другом четыре TextView на вертикальном LinearLayout.

Вот листинг:

public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private MyList myList1;
    private MyList myList2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView);
        myList1 = new MyList("abc", "a333412", "312421", "12314124");
        myList2 = new MyList("gewg", "gewgewas", "gweewwe", "gdshgweh");
        List<MyList> myLists = new ArrayList<MyList>();
        myLists.add(myList1);
        myLists.add(myList2);
        ArrayAdapter<MyList> arrayAdapter = new ArrayAdapter<MyList>(MainActivity.this, R.layout.list_layout, myLists);
        listView.setAdapter(arrayAdapter);    
    }
}

public class MyAdapter extends ArrayAdapter {
    private List<MyList> list;
    public MyAdapter (Context context, List<MyList> list) {
        super(context, R.layout.list_layout, R.id.textView1, list);
        this.list = list;
    }
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_layout,
                parent, false);
        TextView textView1 = (TextView) convertView.findViewById(R.id.textView1);
        TextView textView2 = (TextView) convertView.findViewById(R.id.textView2);
        TextView textView3 = (TextView) convertView.findViewById(R.id.textView3);
        TextView textView4 = (TextView) convertView.findViewById(R.id.textView4);
        MyList myList = list.get(position);
        textView1.setText(myList.getA1().toString());
        textView2.setText(myList.getA2().toString());
        textView3.setText(myList.getA3().toString());
        textView4.setText(myList.getA3().toString());
        return convertView;
    }
}

В классе MyList четыре переменных типа String, геттеры-сеттеры, конструктор из всех 4 переменных и пустой конструктор.

Answer 1
public class SampleListViewAdapterAllGroup extends BaseAdapter {
    public static Context context;
    ArrayList<String> data;
    public SampleListViewAdapterAllGroup(Context context) {
        this.context = context;
    }
    @Override
    public int getCount() {
        return data.size();
    }
    @Override
    public Object getItem(int position) {
        return data.get(position);
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final View twoLineListItem;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            twoLineListItem = (View) inflater.inflate(com.akscorp.blueboard.R.layout.all_group_listview_space, null);
        } else {
            twoLineListItem = (View) convertView;
        }
        TextView tv = (TextView) twoLineListItem.findViewById(com.akscorp.blueboard.R.id.group_name);
        return twoLineListItem;
    }
    }

У вас неверный шаблон адаптера. Он должен наследоваться как выше. Выше и приведен шаблон адаптера

В вашем случае должно выглядеть примерно так

public class MyAdapter extends BaseAdapter {
    private List<MyList> list;
    public MyAdapter (Context context, List<MyList> list) {
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_layout,
                parent, false);
        TextView textView1 = (TextView) convertView.findViewById(R.id.textView1);
        TextView textView2 = (TextView) convertView.findViewById(R.id.textView2);
        TextView textView3 = (TextView) convertView.findViewById(R.id.textView3);
        TextView textView4 = (TextView) convertView.findViewById(R.id.textView4);
        MyList myList = list.get(position);
        textView1.setText(myList.getA1().toString());
        textView2.setText(myList.getA2().toString());
        textView3.setText(myList.getA3().toString());
        textView4.setText(myList.getA3().toString());
        return convertView;
    }
}

Ну и вызывать можно так

 listView.setAdapter(new MyAdapter(context));    
READ ALSO
Как изменить выделенный пункт меню в Navigation

Как изменить выделенный пункт меню в Navigation

Как изменить выделенный пункт меню в Navigation Drawer из его Фрагментов?

200
libGDX поворот текстуры

libGDX поворот текстуры

Пытаюсь рисовать линию с помощью SpriteBatch Беру картинку размером 1х1, растягиваю её до нужных размеров и отрисовываю Таким способом могу рисовать...

312
Как из другого класса изменить элемент формы java

Как из другого класса изменить элемент формы java

Есть два класса Form и CheckedВ классе Form есть Label и кнопка

265
Нажатие на Button и потоки - Java

Нажатие на Button и потоки - Java

Воспроизвожу звук таким образом:

247