Android中ListView的使用以及使用介面卡設定資料來源
阿新 • • 發佈:2020-12-15
場景
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; } } }