Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用customadapter填充listview组件时获取空行_Java_Android_Listview_Custom Adapter - Fatal编程技术网

Java 使用customadapter填充listview组件时获取空行

Java 使用customadapter填充listview组件时获取空行,java,android,listview,custom-adapter,Java,Android,Listview,Custom Adapter,我正在尝试从我的手机访问所有未接来电的详细信息列表。 我正在尝试访问前50个未接来电 问题是当列表视图中的某些行被填充,而某些行为空时 这是它的外观,即空白行 这是我试图访问调用详细信息的java文件 public class Second extends AppCompatActivity { TextView call; ListView l; int count = 0, k = 0; static int flag = 0; @Override

我正在尝试从我的手机访问所有
未接来电的详细信息列表。
我正在尝试访问
前50个
未接来电

问题是当
列表视图中的某些行被填充,而某些行为空时

这是它的外观,即空白行

这是我试图访问调用详细信息的java文件

public class Second extends AppCompatActivity {
    TextView call;
    ListView l;
    int count = 0, k = 0;
    static int flag = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            StringBuffer sb = new StringBuffer();
            Cursor managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null,
                    null, null, null);
            int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
            int name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME);
            int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
            int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
            int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
            int count = 0;
            int dircode = 0;
            String[] array = new String[50];
            int count1 = 0, count2 = 0, count3 = 0, param = 0;
int len=0;
            while (managedCursor.moveToNext()  &&len<50) {
                param = 0;
                String phNumber = managedCursor.getString(number);
                String namee = managedCursor.getString(name);
                String callType = managedCursor.getString(type);
                String callDate = managedCursor.getString(date);
                Date callDayTime = new Date(Long.valueOf(callDate));
                String callDuration = managedCursor.getString(duration);
                String dir = null;
                if (flag == 1) {
                    if (Integer.parseInt(callType) == CallLog.Calls.MISSED_TYPE) {
                        dir = "MISSED";
                        sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   " + callDayTime
                                + " \nCall duration in sec :   " + callDuration);
                    }
                    param = 1;
                }
                if (flag == 2) {
                    if (Integer.parseInt(callType) == CallLog.Calls.INCOMING_TYPE) {
                        dir = "RECEIVED";
                        sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   " + callDayTime
                                + " \nCall duration in sec :   " + callDuration);
                    }
                    param = 1;
                }
                if (flag == 3) {
                    Log.d("asd", "inside flag3");
                    if (Integer.parseInt(callType) == CallLog.Calls.OUTGOING_TYPE) {
                        dir = "DIALLED";
                        sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   "
                                + callDayTime
                                + " \nCall duration in sec :   " + callDuration);
                    }
                    param = 1;

                }
                if (flag == 4) {
                    if (Integer.parseInt(callType) == CallLog.Calls.MISSED_TYPE)
                        count1++;
                    if (Integer.parseInt(callType) == CallLog.Calls.INCOMING_TYPE)
                        count2++;
                    if (Integer.parseInt(callType) == CallLog.Calls.OUTGOING_TYPE)
                        count3++;
                    continue;
                }
                if (param == 1) {
                    array[k] = new String(sb);
                    k++;len++;

                }
                sb.setLength(0);//flushing the buffer
            }
            if (flag == 4) {
                sb.append("Missed Type : " + count1 + "\nReceived type : " + count2 + "\nDialled type: " + count3);
                array[k] = String.valueOf(sb);
                k++;
            }

            l = (ListView) findViewById(R.id.listView);//creating listview
            for (int i = 0; i < array.length; i++) {
                if(array[i]==null)
                   Log.d("asd","NULLLLLL "+ i);
                else
                     Log.d("asd","NOT NULL "+i);
            }
            l.setAdapter(new CustomAdapter(this, array));
            managedCursor.close();
        }catch (SecurityException e){}
    }
}
为了验证所有
50
项都不为空,我使用此代码检查了其中的一些项是否为空---

for(int i=0;i
但所有50次迭代都打印
非空

因此,如果字符串的
数组中的字符串不为空,那么为什么listview中的某些行为空


有人能帮我解决这个问题吗?

我可以看到一个
标志
变量被初始化为0,但从未递增/递减

标志负责将数据存储到
StringBuffer

数组中所有索引不为null的原因是,您正在使用传递到构造函数的
StringBuffer
初始化每个索引

因此,请修复代码中的
标志
变量。这会解决你的问题。您还可以使用这段代码查看每个索引中存储的值

for(int i = 0; i < 50; i++){
   Log.d(LOG_TAG, "data at " + i + ": " + array[i])
}
for(int i=0;i<50;i++){
Log.d(Log_标记,“数据位于”+i+:“+array[i]”)
}

用合适的值替换
LOG\u标记。

我可以看到
标志
变量初始化为0,但从不递增/递减

标志负责将数据存储到
StringBuffer

数组中所有索引不为null的原因是,您正在使用传递到构造函数的
StringBuffer
初始化每个索引

因此,请修复代码中的
标志
变量。这会解决你的问题。您还可以使用这段代码查看每个索引中存储的值

for(int i = 0; i < 50; i++){
   Log.d(LOG_TAG, "data at " + i + ": " + array[i])
}
for(int i=0;i<50;i++){
Log.d(Log_标记,“数据位于”+i+:“+array[i]”)
}
用合适的值替换日志标签。

您应该将“param=1”语句移到内部if语句中。 问题是什么。例如,flag==1。但呼叫类型不是MISSED_类型:

...
if (flag == 1) {
  if (Integer.parseInt(callType) == CallLog.Calls.MISSED_TYPE) {
    dir = "MISSED";
    sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   " + callDayTime
      + " \nCall duration in sec :   " + callDuration);
  }
  param = 1;
}
...
因此,您的sb将为空,但将param设置为1,此空sb将添加到数组中。应将所有if语句替换为:

...
if (flag == 1 && Integer.parseInt(callType) == CallLog.Calls.MISSED_TYPE) {
  dir = "MISSED";
  sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   " + callDayTime
    + " \nCall duration in sec :   " + callDuration);
  param = 1;
}
...
您应该将“param=1”语句移动到内部if语句中。 问题是什么。例如,flag==1。但呼叫类型不是MISSED_类型:

...
if (flag == 1) {
  if (Integer.parseInt(callType) == CallLog.Calls.MISSED_TYPE) {
    dir = "MISSED";
    sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   " + callDayTime
      + " \nCall duration in sec :   " + callDuration);
  }
  param = 1;
}
...
因此,您的sb将为空,但将param设置为1,此空sb将添加到数组中。应将所有if语句替换为:

...
if (flag == 1 && Integer.parseInt(callType) == CallLog.Calls.MISSED_TYPE) {
  dir = "MISSED";
  sb.append("\nName: " + namee + "\nPhone Number:  " + phNumber + " \nCall Type:  " + dir + " \nCall Date:   " + callDayTime
    + " \nCall duration in sec :   " + callDuration);
  param = 1;
}
...

几个月前,我制作了同样的应用程序。但我所做的是使用了一个
游标加载
,因为它创建了一个新线程,并在该线程上执行它,而不会冻结UI。你试过调试这个代码吗?如果是,请发布您发现了什么。@Saran Sankaran,现在我添加了快照。可能现在我的问题已经清楚了。快照太小,无法理解任何内容。请也试着调试这个应用。你的意思是说我应该在android studio的调试控制台中显示输出吗。或者我应该在我的代码中加入
Log
语句来查看执行流程?@Saran Sankaran,增加了快照的大小,现在它是可见的。几个月前我制作了同样的应用程序,就像这样。但我所做的是使用了一个
游标加载
,因为它创建了一个新线程,并在该线程上执行它,而不会冻结UI。你试过调试这个代码吗?如果是,请发布您发现了什么。@Saran Sankaran,现在我添加了快照。可能现在我的问题已经清楚了。快照太小,无法理解任何内容。请也试着调试这个应用。你的意思是说我应该在android studio的调试控制台中显示输出吗。或者我应该在我的代码中放入
Log
语句以查看执行流程?@Saran Sankaran,增加了快照的大小,现在它是可见的。@Saran Sankaran,flag是一个静态变量,在此活动开始之前,其值在上一个活动中设置为1或2或3或4。这就是为什么此活动开始时,flag值不是0。如果我错了,请纠正我。@a874是否尝试添加该for循环以检查数组每个索引处的数据?@Saran Sankaran,flag在这里是一个静态变量,其值在该活动开始之前的上一个活动中设置为1或2或3或4。这就是为什么当该活动开始时,flag值不是0。如果我错了,请纠正我。@a874是否尝试添加该for循环以检查数组每个索引处的数据?