iT邦幫忙

0

[Android] 關於ListView顯示不出來

不好意思打擾一下,
我現在在嘗試使用繼承BaseAdapter的方法實作ListView,
照著書上的方法做,
但就是沒有出現ListView的內容,
但是Log有跑到getView()的地方,
看了好幾次看起來設定跟書上都一樣,
網路上看到的方法也都跟書上一樣,
不知道是有改版還是什麼原因,
我把我的程式碼PO出來,
麻煩大大播空幫忙看一下,
謝謝~

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="#000000">

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#b3000d"
            android:gravity="center_vertical|center_horizontal"
            android:textSize="26dp"
            android:background="#aab0ff"
            android:textStyle="bold"
            android:layout_marginBottom="5dp"
            android:text="List" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#570000">

            <TextView
                android:id="@+id/tv2"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:textColor="#FFFFFF"
                android:gravity="center_vertical|left"
                android:textSize="16dp"
                android:textStyle="bold"
                android:typeface="serif"
                android:text="TextView" />
        </RelativeLayout>

        <ListView
            android:id="@+id/lv_country"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFFFF"
            android:cacheColorHint="#00000000"/>
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

MainActivity.java

package com.example.user.test;

import android.app.Activity;
import android.app.ListActivity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends Activity {
    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //取得控制項物件
        initViews();
        //初始化資料
        initDatas();
        //設定監聽事件
        setListensers();
    }

    private void initViews()
    {
        listView = (ListView)findViewById(R.id.lv_country);
    }

    private void initDatas()
    {
        listView.setAdapter(new EfficientAdapter(this));
    }

    private void setListensers()
    {
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "你點選的項目為: " + Integer.toString(position), Toast.LENGTH_LONG).show();
            }
        });
    }
}

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/myImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_launcher" />

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

        <TextView
            android:id="@+id/myTextView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000"
            android:textSize="16dp"
            android:text="大標題" />

        <TextView
            android:id="@+id/myTextView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000"
            android:textSize="12dp"
            android:text="小標題" />
    </LinearLayout>
</LinearLayout>

EfficientAdapter.java

package com.example.user.test;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class EfficientAdapter extends BaseAdapter {

    private String TAG = "自訂Adapter";
    public static String[] fruit = {"Apple", "Banana", "Orange", "Watermelon"};
    public static String[] fruit_nickname = {"AP", "BA", "OR", "WA"};
    private LayoutInflater mInflater;

    public EfficientAdapter(Context context)
    {
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount(){
        Log.w(TAG, "取得數量: " + fruit.length);
        return fruit.length;
    }

    @Override
    public Object getItem(int position){
        Log.w(TAG, "取得Item: " + fruit.length);
        return position;
    }

    @Override
    public long getItemId(int position){
        Log.w(TAG, "取得ItemId: " + fruit.length);
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder;
        if(convertView == null)
        {
            convertView = mInflater.inflate(R.layout.row, null);
            holder = new ViewHolder();
            holder.text1 = (TextView)convertView.findViewById(R.id.myTextView1);
            holder.text2 = (TextView)convertView.findViewById(R.id.myTextView2);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.text1.setText(fruit[position]);
        holder.text2.setText(fruit_nickname[position]);
        convertView.setTag(holder);

        Log.w(TAG, "寫入資料: " + position + ", " + fruit[position] + ", " + fruit_nickname[position]);
        return convertView;
    }

    static class ViewHolder
    {
        public TextView text1;
        public TextView text2;
    }
}

1 個回答

3
MNGhost
iT邦新手 4 級 ‧ 2018-10-07 18:24:44
最佳解答

第二個LinearLayout屬性長寬match_parent改wrap_content
row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/myImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_launcher_background" />

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

        <TextView
            android:id="@+id/myTextView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000"
            android:textSize="16dp"
            android:text="大標題" />

        <TextView
            android:id="@+id/myTextView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000"
            android:textSize="12dp"
            android:text="小標題" />
    </LinearLayout>
</LinearLayout>
看更多先前的回應...收起先前的回應...
小魚 iT邦高手 1 級 ‧ 2018-10-07 18:48:47 檢舉

真的可以了,
但是為什麼圖片出不來呢?
明明是有圖片的...
https://ithelp.ithome.com.tw/upload/images/20181007/201056945M3aKvlvm8.png

小魚 iT邦高手 1 級 ‧ 2018-10-07 18:53:41 檢舉

話說,
我這程式不知道去哪裡抄的...
改成android:src就可以了...
https://ithelp.ithome.com.tw/upload/images/20181007/20105694Mx4HgOsN37.png

MNGhost iT邦新手 4 級 ‧ 2018-10-07 18:59:46 檢舉

通常我是習慣用src或者background所以也沒遇過哈哈

如果class繼承的是AppcompatActivity
那使用app:srcCompat應該是沒問題的
那由於繼承的是Activity所以請使用src or background
(應該是這樣

小魚 iT邦高手 1 級 ‧ 2018-10-08 19:16:38 檢舉

莓莓( • ` v´• )
是這樣嗎?
我再試試...

小魚
剛回家稍微查詢了一下跟測試
如果繼承AppcompatActivity的確app:srcCompat所指定的內容會出現
繼承activity的則不會顯示
app:srcCompat是api23以後為了另外支援向量圖而產生的新方法
https://android-developers.googleblog.com/2016/02/android-support-library-232.html
(其實平常真的不會用到 所以也是長知識惹)

小魚 iT邦高手 1 級 ‧ 2018-10-09 00:00:43 檢舉

莓莓( • ` v´• )
試了一下,
的確是可以的..

原來那算是比較新版的,
因為我的Android Studio是比較新版的,
自動產生的Activity都是繼承自AppCompatActivity,
只是我照書上的內容操作所以都改成Activity了...

我要發表回答

立即登入回答