Android 设置自定义ListView适配器后未显示ListView
我试图显示一个列表视图,其中应包含发件人号码和短信正文。我正在为此创建一个自定义适配器 下面是我在其中创建和设置自定义适配器(MapInbox.java)的类代码Android 设置自定义ListView适配器后未显示ListView,android,xml,android-layout,listview,android-arrayadapter,Android,Xml,Android Layout,Listview,Android Arrayadapter,我试图显示一个列表视图,其中应包含发件人号码和短信正文。我正在为此创建一个自定义适配器 下面是我在其中创建和设置自定义适配器(MapInbox.java)的类代码 View-baseView; ArrayList sms_id=新建ArrayList(); ArrayList sms_num=新建ArrayList(); ArrayList sms_Name=新建ArrayList(); ArrayList sms_dt=新的ArrayList(); ArrayList sms_body=新建A
View-baseView;
ArrayList sms_id=新建ArrayList();
ArrayList sms_num=新建ArrayList();
ArrayList sms_Name=新建ArrayList();
ArrayList sms_dt=新的ArrayList();
ArrayList sms_body=新建ArrayList();
字符串smsBody,senderNumber;
列表视图lvSms;
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
baseView=充气机。充气(R.layout.fragment\u map\u收件箱,容器,false);
lvSms=(ListView)baseView.findViewById(R.id.lv_sms);
Uri myMessage=Uri.parse(“content://sms/");
ContentResolver cr=getActivity().getContentResolver();
游标c=cr.query(myMessage,新字符串[]{“\u id”,“address”,“date”,
“body”,“read”},“address='03414503584',null,null);
getActivity().startManagingCursor(c);
GetsSmslogs(c);
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
CustomMessagesAdapter CustomMessagesAdapter=新建CustomMessagesAdapter
(getActivity(),R.layout.listview_消息);
设置适配器(customMessagesAdapter);
}
}, 150);
返回基本视图;
}
public void getSmsLogs(光标c){
如果(sms_num.size()>0){
sms_id.clear();
sms_num.clear();
sms_Name.clear();
sms_body.clear();
sms_dt.clear();
}
试一试{
if(c.moveToFirst()){
做{
if(c.getString(c.getColumnIndexOrThrow(“地址”)==null){
c、 moveToNext();
继续;
}
senderNumber=c.getString(
c、 getColumnIndexOrThrow(“地址”);
smsBody=c.getString(c.getColumnIndexOrThrow(“body”);
Log.e(“正文-->”,“”+smsBody);
Log.e(“编号-->”,“”+senderNumber);
sms_num.add(发送者编号);
sms_body.add(smsBody);
}而(c.moveToNext());
}
c、 close();
}捕获(例外e){
e、 printStackTrace();
}
}
私有类CustomMessagesAdapter扩展了ArrayAdapter{
CustomMessagesAdapter(上下文,int资源){
超级(上下文、资源);
}
@非空
@凌驾
公共视图getView(最终整型位置,视图转换视图,@NonNull视图组父级){
最终持票人;
if(convertView==null){
viewHolder=新的viewHolder();
LayoutInflater LayoutInflater=(LayoutInflater)getActivity().getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
convertView=LayoutFlater.inflate(R.layout.listview_消息,父级,false);
viewHolder.tvSenderNumber=(TextView)convertView.findViewById(R.id.tv\u sender\u number);
viewHolder.tvMessage=(TextView)convertView.findViewById(R.id.tv_消息);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.tvSenderNumber.setText(senderNumber);
viewHolder.tvMessage.setText(smsBody);
返回视图;
}
}
私有静态类视图持有者{
文本视图tvSenderNumber;
TextView-tvMessage;
}
MapInbox布局文件的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/messages_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv_sms"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp">
</ListView>
</LinearLayout>
以及消息的自定义listView布局代码(listView_messages.xml):
背景信息
<solid android:color="#00000000" />
<stroke
android:width="2dp"
android:color="#FFF" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<corners
android:bottomLeftRadius="15dip"
android:bottomRightRadius="15dip"
android:topLeftRadius="15dip"
android:topRightRadius="15dip" />
</shape>
我在日志中获得所有必需的消息,我之所以将文本颜色设置为白色,是因为应用程序的背景是黑色的
我做错了什么?
谢谢 您正在编写的ListView适配器目前不知道您的数据源是什么
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.listview_messages, parent, false);
viewHolder.tvSenderNumber = (TextView) convertView.findViewById(R.id.tv_sender_number);
viewHolder.tvMessage = (TextView) convertView.findViewById(R.id.tv_message);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvSenderNumber.setText(senderNumber);
viewHolder.tvMessage.setText(smsBody);
return convertView;
}
适配器有一个名为getCount()
的方法,您应该覆盖该方法,并提供它应该显示多少项。您提供的这个数字用于为您重写并实现的getView()
方法中的int位置提供数据。现在,适配器认为没有数据传输到它(即getCount()
返回0),因此它不会加载任何内容。为了解决这个问题,最好将所有要显示的数据合并到一个自定义类中,如上面Abhiroj Panwar所说,将它们添加到一个ArrayList中,然后在getView中使用getView()
方法中给出的int position
访问每组数据
viewHolder.tvSenderNumber.setText(yourCustomArrayListClass.get(position).senderNumber);
viewHolder.tvMessage.setText(yourCustomArrayListClass.get(position).smsBody);
我建议您首先将数据组织在一个地方。您可以创建一个包含所有SMS详细信息的普通旧Java类(即SMSData),然后使用该类定义ArrayList的类型参数。除此之外,您没有将数据源传递给它可以工作的适配器。
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.listview_messages, parent, false);
viewHolder.tvSenderNumber = (TextView) convertView.findViewById(R.id.tv_sender_number);
viewHolder.tvMessage = (TextView) convertView.findViewById(R.id.tv_message);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvSenderNumber.setText(senderNumber);
viewHolder.tvMessage.setText(smsBody);
return convertView;
}
viewHolder.tvSenderNumber.setText(yourCustomArrayListClass.get(position).senderNumber);
viewHolder.tvMessage.setText(yourCustomArrayListClass.get(position).smsBody);