【问题标题】:How to change color and font on ListView after reading firebase DB阅读firebase DB后如何更改ListView上的颜色和字体
【发布时间】:2018-11-19 08:56:10
【问题描述】:

如何处理为 ListView 显示空视图的问题,因为当我从我的 firebase DB 读取数据并将其显示在 ListView 中时,我不知道我必须放置哪些数据。我正在使用 CustomListAdapter 更改字体颜色和 ListView 的背景颜色

注意:我正在从 firebase 数据库中读取数据并将其显示在 ListView 中,任何解决方案

CustomListAdapter.java

   public class CustomListAdapter extends BaseAdapter {

private static final int HERO_COUNT = 12;
private Context context;
private List<String> items;

public CustomListAdapter(Context context) {
    this.context = context;
    items = new ArrayList<>();
}

@Override
public int getCount() {
    return HERO_COUNT;
}

@Override
public String getItem(int position) {
    if (position >= 0 && position < items.size()) {
        return items.get(position);
    }
    return "";
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View v, ViewGroup parent) {
    View mView = v;
    if (mView == null) {
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mView = vi.inflate(R.layout.custom_list, null, false);

        TextView text = (TextView) mView.findViewById(R.id.textView);
        //textView.setTextColor(Color.BLUE);
        text.setText(getItem(position));
        if (items.isEmpty()) {
            // Set holder color
        } else {
            text.setTextColor(Color.WHITE);
            int color = Color.argb(200, 255, 64, 64);
            text.setBackgroundColor(color);
        }


    }

    return mView;
}

public void updateList(List<String> updatedItems) {
    items.clear();
    items.addAll(updatedItems);
    notifyDataSetChanged();
}
}

ViewDatabase.java

public class ViewDatabase extends AppCompatActivity {
private static final String TAG = "ViewDatabase";

//add Firebase Database stuff
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private String userID;

private ListView mListView;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_database_layout);

    mListView = (ListView) findViewById(R.id.listview);
    CustomListAdapter adapter = new CustomListAdapter(this);
    mListView.setAdapter(adapter);


    //declare the database reference object. This is what we use to access the database.
    //NOTE: Unless you are signed in, this will not be useable.
    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = mFirebaseDatabase.getReference();
    FirebaseUser user = mAuth.getCurrentUser();
    // userID = user.getUid();
    userID = "";

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                toastMessage("Successfully signed in.");
            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
                toastMessage("Successfully signed out.");
            }
            // ...
        }
    };

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
            showData(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}


private void showData(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        DailyInfo uInfo = new DailyInfo();
        uInfo.setHero1(ds.child(userID).getValue(DailyInfo.class).getHero1()); //set the name1
        uInfo.setHero2(ds.child(userID).getValue(DailyInfo.class).getHero2()); //set the name2
        uInfo.setHero3(ds.child(userID).getValue(DailyInfo.class).getHero3()); //set the name3
        uInfo.setHero4(ds.child(userID).getValue(DailyInfo.class).getHero4()); //set the name4
        uInfo.setHero5(ds.child(userID).getValue(DailyInfo.class).getHero5()); //set the name5
        uInfo.setHero6(ds.child(userID).getValue(DailyInfo.class).getHero6()); //set the name6
        uInfo.setHero7(ds.child(userID).getValue(DailyInfo.class).getHero7()); //set the name7
        uInfo.setHero8(ds.child(userID).getValue(DailyInfo.class).getHero8()); //set the name8
        uInfo.setHero9(ds.child(userID).getValue(DailyInfo.class).getHero9()); //set the name9
        uInfo.setHero10(ds.child(userID).getValue(DailyInfo.class).getHero10()); //set the name10
        uInfo.setHero11(ds.child(userID).getValue(DailyInfo.class).getHero11()); //set the name11
        uInfo.setHero12(ds.child(userID).getValue(DailyInfo.class).getHero12()); //set the name12


        //display all the information
        Log.d(TAG, "showData: Hero1: " + uInfo.getHero1());
        Log.d(TAG, "showData: Hero2: " + uInfo.getHero2());
        Log.d(TAG, "showData: Hero3: " + uInfo.getHero3());
        Log.d(TAG, "showData: Hero4: " + uInfo.getHero4());
        Log.d(TAG, "showData: Hero5: " + uInfo.getHero5());
        Log.d(TAG, "showData: Hero6: " + uInfo.getHero6());
        Log.d(TAG, "showData: Hero7: " + uInfo.getHero7());
        Log.d(TAG, "showData: Hero8: " + uInfo.getHero8());
        Log.d(TAG, "showData: Hero9: " + uInfo.getHero9());
        Log.d(TAG, "showData: Hero10: " + uInfo.getHero10());
        Log.d(TAG, "showData: Hero11: " + uInfo.getHero11());
        Log.d(TAG, "showData: Hero12: " + uInfo.getHero12());


        ArrayList<String> array = new ArrayList<>();
        array.add(uInfo.getHero1());
        array.add(uInfo.getHero2());
        array.add(uInfo.getHero3());
        array.add(uInfo.getHero4());
        array.add(uInfo.getHero5());
        array.add(uInfo.getHero6());
        array.add(uInfo.getHero7());
        array.add(uInfo.getHero8());
        array.add(uInfo.getHero9());
        array.add(uInfo.getHero10());
        array.add(uInfo.getHero11());
        array.add(uInfo.getHero12());

     /*   ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
        mListView.setAdapter(adapter);*/

        if (mListView.getAdapter() instanceof CustomListAdapter) {
            ((CustomListAdapter) mListView.getAdapter()).updateList(array);
            mListView.setBackgroundColor(ContextCompat.getColor(mListView.getContext(), R.color.category_colors));
        }
    }

}

@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}


/**
 * customizable toast
 *
 * @param message
 */
private void toastMessage(String message) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}

view_database_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

 <TextView
    android:id="@+id/tvUserInfo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="User Information"
    android:textAlignment="center"
    android:textColor="@color/colorPrimaryDark"
    android:textSize="25sp"/>

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</LinearLayout>

</LinearLayout>

custom_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/textView"
    android:textSize="20px" android:paddingTop="10dip" android:paddingBottom="10dip"/>
</LinearLayout>

DailyInfo.java

public class DailyInfo {

private String hero1;

private String hero2;
private String hero3;
private String hero4;
private String hero5;
private String hero6;
private String hero7;
private String hero8;
private String hero9;
private String hero10;
private String hero11;
private String hero12;



public DailyInfo(){

}


public String getHero1() {
    return hero1;
}

public void setHero1(String hero1) {
    this.hero1 = hero1;
}


public String getHero2() {
 return hero2;
 }

public void setHero2(String hero2) {
    this.hero2 = hero2;
}

public String getHero3() {
    return hero3;
}

public void setHero3(String hero3) {
    this.hero3 = hero3;
}

public String getHero4() {
    return hero4;
}

public void setHero4(String hero4) {
    this.hero4 = hero4;
}

public String getHero5() {
    return hero5;
}

public void setHero5(String hero5) {
    this.hero5 = hero5;
}

public String getHero6() {
    return hero6;
}

public void setHero6(String hero6) {
    this.hero6 = hero6;
}

public String getHero7() {
    return hero7;
}

public void setHero7(String hero7) {
    this.hero7 = hero7;
}

public String getHero8() {
    return hero8;
}

public void setHero8(String hero8) {
    this.hero8 = hero8;
}

public String getHero9() {
    return hero9;
}

public void setHero9(String hero9) {
    this.hero9 = hero9;
}

public String getHero10() {
    return hero10;
}

public void setHero10(String hero10) {
    this.hero10 = hero10;
}

public String getHero11() {
    return hero11;
}

public void setHero11(String hero11) {
    this.hero11 = hero11;
}

public String getHero12() {
    return hero12;
}

public void setHero12(String hero12) {
    this.hero12 = hero12;
}
}

【问题讨论】:

    标签: java android firebase listview custom-adapter


    【解决方案1】:

    在收到ValueEventListener 的响应后,您正在创建适配器:

        CustomListAdapter adapter = new CustomListAdapter(ViewDatabase.this , R.layout.custom_list , mList);
        ListView mListView= findViewById(R.id.listview);
        mListView.setAdapter(adapter);
    

    例如,将适配器设置在onCreate 内的ViewDatabase 上,并根据该初始状态设置颜色。

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.view_database_layout);
    
            mListView = findViewById(R.id.listview);
            CustomListAdapter adapter = new CustomListAdapter(this);
            mListView.setAdapter(adapter);
    
            //[...]
        }
    

    并且,不是创建适配器,而是更新它:

        private void showData(DataSnapshot dataSnapshot) {
    
            //[...]
    
            if (mListView.getAdapter() instanceof CustomListAdapter) {
                ((CustomListAdapter)mListView.getAdapter()).updateList(array);
            }
        } 
    

    您也可以将 ArrayAdapter 替换为 BaseAdapter 作为扩展类:

        public class CustomListAdapter extends BaseAdapter {
    
            private static final int HERO_COUNT = 12;
            private Context context;
            private List<String> items;
    
            public CustomListAdapter(Context context) {
                this.context = context;
                items = new ArrayList<>();
            }
    
            @Override
            public int getCount() {
                return HERO_COUNT;
            }
    
            @Override
            public String getItem(int position) {
                if (position >= 0 && position < items.size()) {
                    return items.get(position);
                }
                return "";
            }
    
            @Override
            public long getItemId(int position) {
                return 0;
            }
    
            @Override
            public View getView(int position, View v, ViewGroup parent) {
                View mView = v;
                if (mView == null) {
                    LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    mView = vi.inflate(R.layout.custom_list, null, false);
                }
                //Bind view content here
                //TODO associate holder to tag
                return mView;
            }
    
            public void updateList(List<String> updatedItems) {
                items.clear();
                items.addAll(updatedItems);
                notifyDataSetChanged();
            }
        }
    }
    

    编辑:

    为了在接收到值时更改列表上的默认背景颜色,您可以在主布局上设置默认颜色:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
     <TextView
        android:id="@+id/tvUserInfo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="User Information"
        android:textAlignment="center"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="25sp"/>
    
    <ListView
        android:id="@+id/listview"
        android:background="@color/empty_color"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
    </LinearLayout>
    
    </LinearLayout>
    

    然后在收到值时更改它:

        private void showData(DataSnapshot dataSnapshot) {
    
            //[...]
    
            if (mListView.getAdapter() instanceof CustomListAdapter) {
                ((CustomListAdapter)mListView.getAdapter()).updateList(array);
                listView.setBackgroundColor(ContextCompat.getColor(listView.getContext(), R.color.loaded_color));
            }
        } 
    

    如果您想要更改行颜色,那么您需要在字符串为空时更改 getView 上的行布局。

    编辑 2 指定在哪里进行视图更改

    【讨论】:

    • 谢谢@randomuser 的回答,实际上,我改变了我的'CustomListAdapter','BaseAdapter' 就像你的代码一样,但首先,将适配器设置在'ViewDatabase' 上让我更改'的签名CustomListAdapter'(Context,int,List) 我做到了,第二请你能告诉我如何在'onCreate'中使用一个空开始的数组来做实例并根据它设置颜色,再次感谢你跨度>
    • 请你告诉我如何在onCreate 中使用一个空开始的数组来做实例并根据它设置颜色,谢谢@randomuser
    • 我更新了我的问题,我正在尝试像这样在 mList 中设置颜色 mList.add(String.valueOf(ContextCompat.getColor(ViewDatabase.this, R.color.colorPrimary)));但它不起作用@randomuser
    • 你为什么要mList.add(String.valueOf(ContextCompat.getColor(ViewDatabase.this, R.color.colorPrimary)))?
    • 现在我更新了我的问题,就像你的代码一样,但它显示了NPE,我用我的logcat 更新了我的问题,你能检查一下吗? @随机用户
    【解决方案2】:

    您仅在之前未创建视图时才修改视图,下一次不会是这种情况,就是这样,当数据可用时。所以,根据你的代码(应该考虑包括一个持有人顺便说一句):

    public View getView(int position, View v, ViewGroup parent) {
        View mView = v;
        if (mView == null) {
            LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mView = vi.inflate(R.layout.custom_list, null, false);
        }
        TextView text = (TextView) mView.findViewById(R.id.textView);
        text.setText(getItem(position));
        if (items.isEmpty()) {
             // Set holder color
        } else {
             text.setTextColor(Color.WHITE);
        }   
        return mView;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多