android - setText 不适用于从 ArrayListAdapter 获取的 View

标签 android listview

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

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;
    }
}

listView 由具有两个 TextView busDestinations 和 busNumber 的水平 View 组成。 setText() 方法没有以所需方式更改文本。它似乎对 busNumberTextView 没有影响。

编辑:正如其他用户所建议的,这些是我现在拥有的代码。

MainActivity.java

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();
        }
    });

}
}

BusAdapter.java

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;
    }
}

ListItem.xml

<?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"/>

Bus.java

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;
    }
}

最佳答案

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

我对 android 有点生疏,所以这是我的建议:

  1. 获取 ListView 和适配器设置:

    mAdapter = new BusAdapter();
    mListView = (ListView) findViewById(R.layout.my_listview);
    mListView.setAdapter(mAdapter);
  1. 将项目点击监听器添加到您的 ListView :

    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()
        }
    });
  1. 在您的适配器中,添加一个名为“onBusItemSelected(int position)”的公共(public)函数并更新您的数据结构。例如,有一个标记为“已选择”的 bool 变量。默认情况下为 false。

   ...
   void onItemSelected(int position) {
       getItem(position).selected = true;
   }
  1. 最后,您的自定义 ArrayAdapter 需要更新 getView() 项以查找新变量并根据该变量更新文本颜色。

   public View getView(int position, View convertView, ViewGroup parent)       
       ...
       if (bus.selected) {
          holder.textView.setTextColor(RED);
       } else {
          holder.textView.setTextColor(BLACK);
       }
       ...
   }

关于android - setText 不适用于从 ArrayListAdapter 获取的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482667/

相关文章:

android - 找不到所有蓝牙设备android

android - 如何通过单击按钮更改布局的背景颜色

android - 是否可以将尺寸设置为独立于 map 缩放级别的 groundOverlay?

android - 为什么动态生成的ListView文字是灰色的?

java - Android中如何从ListView中获取当前所选项目的背景颜色

Android:如何在代码中获取 "listPreferredItemHeight"属性的值?

java - LibGDX - 如何保存生成的 FreeType 字体

Android ListView 组

android - MatrixCursor 的问题

android - 如何在 ListView 中将 webview 作为一行加载?