Android список с изображением - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь получить элемент списка с некоторой информацией и изображением, но он не работает, и я не знаю почему. Пока я проверяю базу данных, я вижу все так, как должно быть. Сцены не пусты, они ссылаются правильно и работают хорошо. Однажды проблема заключается в перечислении его с этим адаптером. Любые советы?

@ Редактировать: Этот код работает сейчас!

Активность и адаптер как внутренний класс:

public class ScenePanel extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scene_panel);

        showScenes();
    }

    /**
     * Show all scenes as listView
     */
    private void showScenes()
    {
        SceneDao dao = new SceneDao(this);
        ArrayList<Scene> allScenes = dao.getAll();
        SceneAdapter sceneAdapter = new SceneAdapter(this, allScenes);
        ListView sceneView = findViewById(R.id.scene_view);
        sceneView.setAdapter(sceneAdapter);
    }

    /**
     * Extract bitmap from color of light.
     *
     * @param lightId to get its color
     * @return
     */
    private Bitmap extractColor(String lightId)
    {
        LightDao dao = new LightDao(this);
        Rect rect = new Rect(0, 0, 1, 1);
        Bitmap image = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(image);
        Paint paint = new Paint();
        paint.setColor(new BigDecimal(dao.getById(lightId).getColor()).intValue());
        canvas.drawRect(0, 0, 1, 1, paint);
        return image;
    }

    /**
     * Custom adapter for listing the scenes as ListView.
     */
    private class SceneAdapter extends BaseAdapter
    {
        private List<Scene> scenes;
        private LayoutInflater inflater;

        public SceneAdapter(Context ctx, List<Scene> scenes)
        {
            this.scenes = scenes;
            inflater = LayoutInflater.from(ctx);
        }

            @Override
        public int getCount() {
            return scenes.size();
        }

       @Override
       public Object getItem(int position) {
           return scenes.get(position);
       }

       @Override
       public long getItemId(int position) {
           return position;
       }

       @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null) {
            convertView = inflater.inflate(R.layout.scene, parent, false);
        }

        ImageView image = convertView.findViewById(R.id.color_image);
        TextView name = convertView.findViewById(R.id.scene_name);
        TextView startingTrack = convertView.findViewById(R.id.starting_track);
        TextView nextTrack = convertView.findViewById(R.id.next_track);

        Scene target = scenes.get(position);
        String light = target.getLight();
        if (light != null)
        {
            image.setImageBitmap(extractColor(light));
        }
        if (target.getName() == null || target.getName().equals(""))
        {
            name.setText(target.getId());
        } else
        {
            name.setText(target.getName());
        }
        startingTrack.setText(target.getStartingTrack());
        nextTrack.setText(target.getNextTrack());

        convertView.setTag(position);
        return convertView;
    }

и мой layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal">

    <ImageView
            android:id="@+id/color_image"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginBottom="5dp" />

    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <TextView
                android:id="@+id/scene_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="20sp"
                android:textStyle="bold" />

        <TextView
                android:id="@+id/starting_track"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="18sp" />

        <TextView
                android:id="@+id/next_track"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:textSize="18sp" />
    </LinearLayout>
</LinearLayout>

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Ваша реализация из adapter неверна. Должно быть так:

    @Override
    public int getCount() {
        return scenes.size(); //returns total of items in the list
    }

    @Override
    public Object getItem(int position) {
        return scenes.get(position); //returns list item at the specified position
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null) {
            convertView = inflater.inflate(R.layout.scene, parent, false);
        }

        ImageView image = convertView.findViewById(R.id.color_image);
        TextView name = convertView.findViewById(R.id.scene_name);
        TextView startingTrack = convertView.findViewById(R.id.starting_track);
        TextView nextTrack = convertView.findViewById(R.id.next_track);

        Scene target = scenes.get(position);
        String light = target.getLight();
        if (light != null)
        {
            image.setImageBitmap(extractColor(light));
        }
        if (target.getName() == null || target.getName().equals(""))
        {
            name.setText(target.getId());
        } else
        {
            name.setText(target.getName());
        }
        startingTrack.setText(target.getStartingTrack());
        nextTrack.setText(target.getNextTrack());

        convertView.setTag(position);
        return convertView;
    }
1 голос
/ 16 октября 2019

Вы возвращаете 0 в getCount

Должно быть возвращено количество элементов в списке.

...