Android setText不处理从ArrayListAdapter获取的视图

Android setText不处理从ArrayListAdapter获取的视图,android,listview,Android,Listview,我正在尝试操作ArrayList适配器中的视图。我正在使用以下代码: for (int i = 0; i < listView.getCount(); i++){ TextView busDestTextView = (TextView) busAdapter.getView(i, null, null).findViewById(R.id.busDestinations); TextView busNumberTextView = (TextView) busAdapte

我正在尝试操作ArrayList适配器中的视图。我正在使用以下代码:

for (int i = 0; i < listView.getCount(); i++){
    TextView busDestTextView = (TextView) busAdapter.getView(i, null, null).findViewById(R.id.busDestinations);
    TextView busNumberTextView = (TextView) busAdapter.getView(i, null, null).findViewById(R.id.busNumber);
    if (dataSnapshot.getKey().equals(busDestTextView.getText().toString())){
        busNumberTextView.setText(dataSnapshot.getValue().toString());
        break;
    }
}

我认为您在
busAdapter.getView(I,null,null)
中放置了ViewGroup null。您可以阅读:,android.view.view,android.view.ViewGroup)

您有两种方法。1您可以将listview与McClickListener一起使用。另一种方法是在总线阵列适配器中实现OnItemSelectedListener

我对android有点生疏,所以我推荐如下:

  • 获取列表视图和适配器设置:
  • 将项目单击侦听器添加到列表视图:
  • 在适配器中,添加一个名为“onBusItemSelected(int-position)”的公共函数,并更新数据结构。例如,将布尔变量标记为“selected”。默认情况下,它是false
  • 最后,自定义ArrayAdapter需要更新getView()项以查找新变量并基于该变量更新文本颜色

  • 你在哪里执行这个代码?子类ListView并重写getView()方法以根据位置设置文本。我使用的是Firebase数据库,如果键与ListView中的任何总线目的地匹配,则希望更新ListView中的总线号。我认为您误解了使用ListView和adpaters的方法。信息更新应在适配器上完成,然后刷新listview。请显示一个,这也意味着您的firebase代码抱歉更新问题太晚。请大家现在看一看。
    package com.example.busnotifier;
    import ...;
    
    public class MainActivity extends AppCompatActivity {
    
    private FirebaseDatabase mFirebaseInstance;
    private DatabaseReference mFirebaseDatabase;
    private FirebaseMessaging mFirebaseMessaging;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        final ArrayList<Bus> buses = new ArrayList<Bus>();
        buses.add(new Bus("Dev_Guradiya~Industry_House~Palasia", 0));
        buses.add(new Bus("Bhavarkua-V", 0));
        buses.add(new Bus("Boys_hostel~teen_imli~Khajarana", 0));
        buses.add(new Bus("Khativala~Rani_Sati~Agnibaan~Khajrana", 0));
        buses.add(new Bus("Kalani_Naga", 0));
        buses.add(new Bus("Khandwa_naka~Shalimaar~Scheme_54", 0));
        buses.add(new Bus("tilak_nagar", 0));
        buses.add(new Bus("Rani_Sati~Agnibaan~Khajrana~Rani_sati", 0));
        buses.add(new Bus("Industry_House~Rani_Sati~Agnibaan~Khajrana", 0));
        buses.add(new Bus("Agnibaan~Khajarana~Rani_Sati", 0));
        buses.add(new Bus("PardesipuraVijaynagar", 0));
        buses.add(new Bus("Sai_Mandir~VijayNagar", 0));
        BusAdapter busAdapter= new BusAdapter(this, buses);
    
        // Get a reference to the ListView, and attach the adapter to the listView.
        final ListView listView = (ListView) findViewById(R.id.busListView);
        listView.setAdapter(busAdapter);
    
        mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseInstance.getReference("Buses").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                for (int i = 0; i < listView.getCount(); i++){
                    if (dataSnapshot.getKey().equals(buses.get(i).getDestinations())){
                        TextView busNumberTextView = (TextView) listView.getChildAt(i).findViewById(R.id.busNumber);
                        busNumberTextView.setText(dataSnapshot.getValue().toString());
                    }
                }
                Toast.makeText(getApplicationContext(), ""+dataSnapshot.getKey(), Toast.LENGTH_SHORT).show();
            }
        });
    
    }
    }
    
    package com.example.busnotifier;
    
    import ....;
    
    public class BusAdapter extends ArrayAdapter<Bus> {
        private FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
    
        private DatabaseReference mDatabaseReference = mFirebaseDatabase.getReference("Buses");
        public BusAdapter(Activity context, ArrayList<Bus> buses){
            super(context, 0, buses);
        }
    
        public View getView(int position, View convertView, ViewGroup parent){
            View busListItemView = convertView;
            if(busListItemView == null) {
                busListItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
            }
    
            //        TextView for the Bus number
            Bus currentBus = getItem(position);
            final TextView busNumberTextView = (TextView) busListItemView.findViewById(R.id.busNumber);
            busNumberTextView.setText(String.valueOf(currentBus.getBusNumber()));
    
            //        Used EraserRegular font for the bus-stop names
            Typeface typeFace = Typeface.createFromAsset(getContext().getAssets(), "fonts/KGSecondChancesSolid.ttf");
            busNumberTextView.setTypeface(typeFace);
    
            //        TextView for the destinations of the corresponding bus-number
            final Button destinationsTextView = (Button) busListItemView.findViewById(R.id.busDestinations);
            destinationsTextView.setText(currentBus.getDestinations());
            destinationsTextView.setTypeface(typeFace);
            destinationsTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /*If the user clicks on a button it will change color and subscribe
                    the user to corresponding Topic of the FireBase*/
                    Toast.makeText(getContext(), "Subscribed to: "+destinationsTextView.getText(), Toast.LENGTH_LONG).show();
                    int color = ContextCompat.getColor(getContext(), R.color.buttonClicked);
                    destinationsTextView.setBackgroundColor(color);
                    FirebaseMessaging.getInstance().subscribeToTopic(String.valueOf(destinationsTextView.getText().toString()));
                    mDatabaseReference.child(destinationsTextView.getText().toString()).setValue(Integer.parseInt(busNumberTextView.getText().toString()));
                    Log.d(">>>>", "onClick: "+destinationsTextView.getText().toString()+"/"+busNumberTextView.getText().toString());
                }
            });
    
            return busListItemView;
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:padding="5dp"
    android:gravity="center"
    android:background="#414141"
    android:id="@+id/busListEntry"
    android:layout_height="wrap_content">
    
    <Button
        android:layout_width="0dp"
        android:id="@+id/busDestinations"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:layout_weight="5"
        android:background="@color/buttonColor"
        android:textColor="#fff"
        android:paddingLeft="5dp"
        android:textAllCaps="false"
        android:layout_marginRight="10dp"
        tools:text="aksjfdkaskdfalsasfasfasfasdasf aslkjfaksjfkjaks dkajsdf asdfajsdfjalksd fasjflkajsdasf asjfkajsdklfjas"
        android:textSize="17sp"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:id="@+id/busNumber"
        android:textStyle="bold"
        android:textSize="17sp"
        android:textColor="#fff"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="@drawable/round_background"
        tools:text="1"/>
    
    package com.example.busnotifier;
    
    public class Bus {
        private int busNumber;
        private String destinations;
    
        public Bus(String destinations, int busNumber) {
            this.busNumber = busNumber;
            this.destinations = destinations;
        }
    
        public int getBusNumber() {
            return busNumber;
        }
    
        public String getDestinations() {
            return destinations;
        }
    
        public void setDestinations(String destinations) {
            this.destinations = destinations;
        }
    
        public void setBusNumber(int busNumber) {
            this.busNumber = busNumber;
        }
    }
    
    
        mAdapter = new BusAdapter();
        mListView = (ListView) findViewById(R.layout.my_listview);
        mListView.setAdapter(mAdapter);
    
    
        mListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view,int position, long id) {
                mAdapter.onBusItemSelected(position);
                Log("Selected item at position " + position);
                mAdapter.notifyDataSetChanged()
            }
        });
    
    
       ...
       void onItemSelected(int position) {
           getItem(position).selected = true;
       }
    
    
       public View getView(int position, View convertView, ViewGroup parent)       
           ...
           if (bus.selected) {
              holder.textView.setTextColor(RED);
           } else {
              holder.textView.setTextColor(BLACK);
           }
           ...
       }