setText无法处理从ArrayListAdapter获取的视图

时间:2017-04-18 21:41:10

标签: android listview

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

public IHttpActionResult Get(int id)
{
    var product = products.FirstOrDefault(p => p.Id == id);
    if (product == null)
    {
        return NotFound();
    }
    else
    {
        return Ok(product);
    }
}

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

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

MainActivity.java

public string Get(int id)
{
   return "product test";
}

BusAdapter.java

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

ListItem.xml

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

}
}

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

2 个答案:

答案 0 :(得分:1)

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

我对android有点生疏,所以我推荐这个:

  1. 获取列表视图和适配器设置:
  2. pytest -v test/
    
    1. 将项目点击监听器添加到列表视图中:
    2. 
          mAdapter = new BusAdapter();
          mListView = (ListView) findViewById(R.layout.my_listview);
          mListView.setAdapter(mAdapter);
      
      1. 在适配器中,添加名为“onBusItemSelected(int position)”的公共函数并更新数据结构。例如,有一个标记为“selected”的布尔变量。默认情况下,它是假的。
      2. 
            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. 最后,您的自定义ArrayAdapter需要更新getView()项以查找新变量并根据该变量更新文本颜色。
        2. 
             ...
             void onItemSelected(int position) {
                 getItem(position).selected = true;
             }
          

答案 1 :(得分:0)

我认为你将ViewGroup null放在busAdapter.getView(i, null, null)中。你可以阅读:https://developer.android.com/reference/android/widget/Adapter.html#getView(int,android.view.View,android.view.ViewGroup)