1. 程式人生 > 實用技巧 >Android中ListView的使用以及使用介面卡設定資料來源

Android中ListView的使用以及使用介面卡設定資料來源

場景

Android中使用Adapter(介面卡)給RecycleView設定資料來源:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/110926089

之前講過使用介面卡給RecycleView進行設定資料來源,可能對於新手不是很友好。

如果只是想簡單的在頁面中顯示一個物件list的某屬性值怎樣使用介面卡給listView設定資料來源。

注:

部落格:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。

實現

首先在佈局檔案中新增一個ListView元件

    <ListView
        android:id="@+id/lv_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

然後再新建一個Bean用來儲存資料物件。

package com.badao.badaoimclient.bean;
import android.support.annotation.NonNull;

import java.util.List;
public class ChatBean {
    
    
private String msg; private int code; @NonNull private String id = ""; private List<ChatItem> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getCode() { return code; }
public void setCode(int code) { this.code = code; } public List<ChatItem> getData() { return data; } public void setData(List<ChatItem> data) { this.data = data; } @NonNull public String getId() { return id; } public void setId(@NonNull String id) { this.id = id; } public static class ChatItem { private int id; private String msgNum; private String content; //語音訊息伺服器地址 private String remoteContent; private String sender; private String receiver; private String type; private boolean canReceived; private String sendTime; private String receivedTime; //語音時長 private int voiceDuration; private boolean isRead; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getMsgNum() { return msgNum; } public void setMsgNum(String msgNum) { this.msgNum = msgNum; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getReceiver() { return receiver; } public void setReceiver(String receiver) { this.receiver = receiver; } public String getType() { return type; } public void setType(String type) { this.type = type; } public boolean isCanReceived() { return canReceived; } public void setCanReceived(boolean canReceived) { this.canReceived = canReceived; } public String getSendTime() { return sendTime; } public void setSendTime(String sendTime) { this.sendTime = sendTime; } public String getReceivedTime() { return receivedTime; } public void setReceivedTime(String receivedTime) { this.receivedTime = receivedTime; } public int getVoiceDuration() { return voiceDuration; } public void setVoiceDuration(int voiceDuration) { this.voiceDuration = voiceDuration; } public String getRemoteContent() { return remoteContent; } public void setRemoteContent(String remoteContent) { this.remoteContent = remoteContent; } public boolean isRead() { return isRead; } public void setRead(boolean read) { isRead = read; } } }

具體要使用的欄位根據自己的需要。

然後在listview所在佈局檔案對應的activity中

首先先定義一個內部類的介面卡

privateMyAdapter myAdapter;

介面卡的宣告在activity的內部類中宣告

   /**
     * 定義一個介面卡
     */
    private class MyAdapter extends BaseAdapter {

        private List<ImUserBean.RowsBean> rowsBeanList ;

        public MyAdapter(List<ImUserBean.RowsBean> rowsBeanList){
            this.rowsBeanList = rowsBeanList;
        }
        // 返回需要顯示的條目數
        @Override
        public int getCount() {
            return rowsBeanList==null?0:rowsBeanList.size();
        }

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

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

        /**
         * 獲取一個View用來顯示ListView的資料,會作為ListView的一個條目顯示
         * @param position 當前需要顯示的View的索引
         * @param convertView 或存資料的物件
         * @param parent
         * @return 返回需要顯示的View
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView textView = new TextView(AddressBookActivity.this);
            //設定每一項顯示的內容
            textView.setText(rowsBeanList.get(position).getImNumX()+"-----"+((int)rowsBeanList.get(position).getCanOnlineX()==1?"線上":"不線上"));
            //設定每一項的點選事件
            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(AddressBookActivity.this,SendMessageActivity.class);
                    intent.putExtra("imnum",rowsBeanList.get(position).getImNumX());
                    startActivity(intent);
                }
            });
            return textView;
        }
    }

使介面卡擴充套件自BaseAdapter並重寫其方法,在內部類中

宣告資料來源的實體bean的list,然後在內部類介面卡的構造方法中對其進行賦值。

在getCount方法中設定顯示的條目數為資料來源的長度。

在getItem中設定每一項為資料來源對應下標的每一項。

在getView中設定一個檢視textView來顯示listView的資料,它將作為ListView的一個條目進行顯示。

並且還可以設定每一項的顯示的文字內容和點選事件。

然後在onCreate方法中非同步呼叫介面獲取資料來源,並通過介面卡的構造方法給

介面卡中的資料來源賦值。

然後給通過id獲取到的listView設定介面卡。

activity完整程式碼:

package com.badao.badaoimclient.view;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.badao.badaoimclient.R;
import com.badao.badaoimclient.bean.ImUserBean;
import com.badao.badaoimclient.web.WebClient;

import java.io.IOException;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class AddressBookActivity extends AppCompatActivity {


    private ListView listView;
    private List<ImUserBean.RowsBean> rowsBeanList;
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address_book);
        listView = findViewById(R.id.lv_list);
        //非同步請求通訊錄
        WebClient.getInstance().getImUserList().enqueue(new Callback<ImUserBean>() {
            @Override
            public void onResponse(Call<ImUserBean> call, Response<ImUserBean> response) {
                Log.i("response",response.toString());
                if(response.code()==200) {
                    ImUserBean userBean = response.body();
                    rowsBeanList = userBean.getRows();
                    myAdapter = new MyAdapter(rowsBeanList);
                    listView.setAdapter(myAdapter);

                }
            }

            @Override
            public void onFailure(Call<ImUserBean> call, Throwable t) {
                Log.i("onFailure",t.toString());
            }
        });

    }

    /**
     * 定義一個介面卡
     */
    private class MyAdapter extends BaseAdapter {

        private List<ImUserBean.RowsBean> rowsBeanList ;

        public MyAdapter(List<ImUserBean.RowsBean> rowsBeanList){
            this.rowsBeanList = rowsBeanList;
        }
        // 返回需要顯示的條目數
        @Override
        public int getCount() {
            return rowsBeanList==null?0:rowsBeanList.size();
        }

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

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

        /**
         * 獲取一個View用來顯示ListView的資料,會作為ListView的一個條目顯示
         * @param position 當前需要顯示的View的索引
         * @param convertView 或存資料的物件
         * @param parent
         * @return 返回需要顯示的View
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView textView = new TextView(AddressBookActivity.this);
            //設定每一項顯示的內容
            textView.setText(rowsBeanList.get(position).getImNumX()+"-----"+((int)rowsBeanList.get(position).getCanOnlineX()==1?"線上":"不線上"));
            //設定每一項的點選事件
            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(AddressBookActivity.this,SendMessageActivity.class);
                    intent.putExtra("imnum",rowsBeanList.get(position).getImNumX());
                    startActivity(intent);
                }
            });
            return textView;
        }
    }
}