1

我正在尝试制作一个让用户存储和保存联系人的应用程序。它可以保存,但它有列出的问题。

我有一个贯穿数据库的 for 循环,并为每个联系人(每一行)、一个图像(实际上它是一个字符串,因为它通过路径)和一个字符串打印一组数据。它在滚动视图中打印它们,每个联系人都有一个线性布局(每个联系人都有自己的线性布局,这样我就可以让一个联系人每个占据一行)。图像出来了,但是,文本视图无处可寻。

使用 log.d(textview.getText()); 它确认文本视图已创建并占用空间。 http://chesnutcase.heliohost.org/derpbox/itv1.png 两个带有名字的“联系人”,没有打印出来。中间的空间大概是由文本视图。 http://chesnutcase.heliohost.org/derpbox/itv2.png 另外两个“联系人”,但没有名字。彼此之间没有空间。或者至少,空间要小得多。代码:

DatabaseHandler db = new DatabaseHandler(this);
    int a = (int) (long) db.countRows();
    LinearLayout theLayout = (LinearLayout)findViewById(R.id.contactsList);
    for(int i = 0;i<a;i++){
        ImageButton image = new ImageButton(this);
        int density=getResources().getDisplayMetrics().densityDpi;
        LinearLayout.LayoutParams vp  = new LinearLayout.LayoutParams(density,density, 0.5f);
        image.setLayoutParams(vp);
        image.setScaleType(ImageView.ScaleType.FIT_END);
        int b = a - i;
        try {
            image.setImageBitmap(decodeUri(Uri.parse(db.getContactData("photo_path")[i])));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        theLayout.addView(image);
        TextView tv = new TextView(this);
        tv.setText(db.getContactData("name")[i]);
        Log.d("UserLog","name is "  + db.getContactData("name")[i]);
        Log.d("UserLog","textfield contains " + tv.getText());
        LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
        tv.setLayoutParams(vp2);
        tv.setBackgroundColor(Color.RED);
        theLayout.addView(tv);
    }

有什么解决办法吗?提前致谢

4

4 回答 4

2

仔细检查您已将哪个方向应用于LinearLayout您的联系人列表。

LayoutParams对你的TextView. 您正在制作TextView0px x 0px 的权重为 1。

LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
tv.setLayoutParams(vp2);

尝试使用MATCH_PARENTWRAP_CONTENT常量之一。它们在这里列出:http: //developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT

如果您希望您TextView占据屏幕的剩余宽度,我会将权重保留为 1,宽度保留为 0,但您需要将高度设置为常数,例如WRAP_CONTENT.

您还将您的大小设置为ImageView设备屏幕密度(这是一个常数),而不是根据您的屏幕密度设置缩放大小。

于 2013-08-01T15:34:47.110 回答
1

您可能需要调用requestLayout(); 为了更新当前视图布局。

theLayout.requestLayout();

此外,您似乎正在使用该布局参数创建一个宽度为 0 且高度为 0 的视图:

LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
于 2013-08-01T15:30:41.587 回答
0

最好将ListView用于此类列表。您只需要编写一个Adapter,它表示在列表中创建一行的逻辑。

于 2013-08-01T15:38:37.633 回答
0

我建议使用一个CursorAdapter布局 xml 文件,这样您就可以将其设计成您想要的样子,并进行预览。这比设置所有这些要容易得多LayoutParams

如果您必须动态创建它们,您可能会发现文本颜色与背景颜色相同,请尝试将其设置为可见的颜色,例如亮红色以进行测试。如果您仍然看不到文本,则可能是它的可见性未设置为View.VISIBLE最终布局可能不是正确的大小,一个方便的提示是将背景设置为适当醒目的颜色,即使有没有文字你应该看到一个阴影块。

于 2013-08-01T15:40:41.617 回答