You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ListView内TextView文本颜色与大小无法修改问题求助

解决ListView中TextView样式修改无效的问题

问题描述

我有一个ListView,尝试修改其中TextView的文本颜色与大小,但没有效果且未报错。之前尝试操作时会报错,现在无报错却无法实现修改。当前ListView显示的文本为默认样式。

代码示例

public class MainActivity extends AppCompatActivity {

    DatabaseReference databaseReference;
    List<pdfClass> uploads;
    ListView listview;
    FloatingActionButton floatingActionButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listview = findViewById(R.id.listview);
        floatingActionButton = findViewById(R.id.floatingActionButton);
        uploads = new ArrayList<>();

        viewAllFiles();

        listview.setOnItemClickListener((parent, view, position, id) -> {
            pdfClass pdfupload = uploads.get(position);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setType("application/pdf");
            intent.setData(Uri.parse(pdfupload.getUrl()));
            startActivity(intent);
        });

        floatingActionButton.setOnClickListener(view->{
            Intent intent = new Intent(getApplicationContext(),UploadPDF.class);
            startActivity(intent);

        });
    }

    private void viewAllFiles() {

        databaseReference = FirebaseDatabase.getInstance().getReference("Uploads");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot postsnapshot : snapshot.getChildren()){
                    pdfClass pdfClass = postsnapshot.getValue(furkan.demirel.myapplication.pdfClass.class);
                    uploads.add(pdfClass);


                }
                String[] Uploads = new String[uploads.size()];
                for (int i =0;i<Uploads.length;i++){
                    Uploads[i]=uploads.get(i).getName();

                }
                ArrayAdapter<String> adapter= new ArrayAdapter<String>(getApplicationContext(),
                        android.R.layout.simple_list_item_1,Uploads){


                    @NonNull
                    @Override
                    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent){
                        View view = super.getView(position,convertView,parent);
                        TextView text =(TextView) view.findViewById(android.R.id.text1);
                        text.setTextColor(Color.BLACK);
                        text.setTextSize(22);
                        return view;
                    }
                };
                listview.setAdapter(adapter);

            }



            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

}

问题分析

  1. 数据重复导致Adapter反复创建:addValueEventListener是实时监听,每次数据变化都会触发onDataChange,但代码未在每次触发时清空uploads列表,会导致数据重复添加,Adapter反复重建,虽不是样式失效的直接原因,但属于潜在问题。
  2. 上下文不一致引发样式覆盖:创建ArrayAdapter时使用getApplicationContext(),应用上下文的主题可能与当前Activity主题存在差异,导致代码设置的TextView样式被系统主题覆盖。
  3. 系统布局样式优先级问题:android.R.layout.simple_list_item_1中的TextView继承了系统主题的样式属性,直接通过代码设置的样式可能被覆盖。

解决方案

方案1:修复上下文与数据重复问题

  • 在onDataChange开始时清空uploads列表,避免重复添加数据:
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
    uploads.clear(); // 清空旧数据
    for (DataSnapshot postsnapshot : snapshot.getChildren()){
        pdfClass pdfClass = postsnapshot.getValue(furkan.demirel.myapplication.pdfClass.class);
        uploads.add(pdfClass);
    }
    // 后续构建数组和Adapter的代码不变
}
  • 创建ArrayAdapter时,将getApplicationContext()替换为当前Activity实例MainActivity.this,保证主题一致性:
ArrayAdapter<String> adapter= new ArrayAdapter<String>(MainActivity.this,
        android.R.layout.simple_list_item_1,Uploads){
    // 重写getView的代码不变
};

方案2:使用自定义列表项布局(更可靠)

自定义布局可完全控制TextView样式,避免系统布局的样式冲突:

  1. 在res/layout下创建list_item_pdf.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_pdf_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingVertical="12dp"
    android:paddingHorizontal="16dp"
    android:textColor="@android:color/black"
    android:textSize="22sp" />
  1. 修改Adapter的创建代码,使用自定义布局:
ArrayAdapter<String> adapter= new ArrayAdapter<String>(MainActivity.this,
        R.layout.list_item_pdf, R.id.tv_pdf_name, Uploads);

此时无需重写getView方法,样式直接在布局中定义,稳定可控。

方案3:明确指定文字大小单位

如果坚持使用系统布局,在重写getView时明确指定文字大小的单位为sp,避免单位误解:

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent){
    View view = super.getView(position,convertView,parent);
    TextView text =(TextView) view.findViewById(android.R.id.text1);
    text.setTextColor(Color.BLACK);
    text.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22); // 明确设置为22sp
    return view;
}

内容的提问来源于stack exchange,提问作者Ezgi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:45:42