如何访问由 arrayadapter 生成的列表视图项

Posted

技术标签:

【中文标题】如何访问由 arrayadapter 生成的列表视图项【英文标题】:How to access listview items generated by arrayadapter 【发布时间】:2014-09-09 04:23:10 【问题描述】:

我已将我的应用程序绑定到 Firebase 数据库,并且在能够显示它们之后,我还希望能够选择它们并访问它们的 textview 值。但是 .getValue() 不适用于视图。我知道我的代码非常混乱,我的选择器只能以一种方式工作,但你能帮我找出发生了什么吗?我将添加一个屏幕截图以使事情更清楚。在单击其中一项 int num = Integer.parseInt(text) 时会出现错误,并且应用程序将崩溃,因为我从视图中获得的值是“android.widget ...”,而不是我想要的. 截图图片:

Orders.java

public class Orders extends ActionBarActivity 
    public final static String TOTAL_SUM = "com.nordscript.checkmate.SUM";

// Declare the UI components
    private ListView foodList;

    // Declare an ArrayAdapter that we use to join the data set and the ListView
    // is the way of type safe, means you only can pass Strings to this array
    //Anyway ArrayAdapter supports only TextView
    private ArrayAdapter arrayAdapter;

    private Firebase ref;
    private Orders activ;
    private ArrayList<String> dishes;
    public int total;

@Override
protected void onCreate(Bundle savedInstanceState) 
    activ = this;
    dishes = new ArrayList<String>(20);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_orders);

 // Initialize the UI components
    foodList = (ListView)findViewById(R.id.listView1);

    // Create a reference to a Firebase location
    ref = new Firebase("https://xxxxxxxxxx.firebaseio-demo.com/Restaurants/Restaurant 2/Tables/Table 2/Orders");

    // Read data and react to changes
    ref.addChildEventListener(new ChildEventListener() 
          @Override
          public void onChildAdded(DataSnapshot snapshot, String previousChildName) 
            Map s = snapshot.getValue(Map.class);
            dishes.add(snapshot.getName() + "  " + ((Map)snapshot.getValue(Map.class)).get("Price"));
            Log.i("Test", dishes.toString());
            arrayAdapter = new ArrayAdapter(activ, android.R.layout.simple_list_item_1, dishes.toArray());

            // By using setAdapter method, you plugged the ListView with adapter
            foodList.setAdapter(arrayAdapter);
          

          @Override public void onChildChanged(DataSnapshot snapshot, String previousChildName)  

          @Override public void onChildRemoved(DataSnapshot snapshot) 
            Map s = snapshot.getValue(Map.class);
            dishes.remove(snapshot.getName() + "  " + ((Map)snapshot.getValue(Map.class)).get("Price"));
            Log.i("Test", dishes.toString());
            arrayAdapter = new ArrayAdapter(activ, android.R.layout.simple_list_item_1, dishes.toArray());

            // By using setAdapter method, you plugged the ListView with adapter
            foodList.setAdapter(arrayAdapter);
          

          @Override public void onChildMoved(DataSnapshot snapshot, String previousChildName)  

          @Override
          public void onCancelled(FirebaseError arg0)  
    );

    foodList.setOnItemClickListener(new OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

            view.setBackgroundColor(Color.GREEN);
            String text = view.toString();
            text.replaceAll("[^\\d.]", "");
            int num = Integer.parseInt(text);
            total += num;
        
    );



@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.orders, menu);
    return true;


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) 
        return true;
    
    return super.onOptionsItemSelected(item);


public void toPayment(View view) 
    Intent pay = new Intent(this, PaymentMethod.class);
    pay.putExtra(TOTAL_SUM, total);
    startActivity(pay);




【问题讨论】:

【参考方案1】:

我从你的问题中了解到:假设当你点击第三个项目,即“pudding 8”时,你想要这个值“pudding 8”(textview 值)。正确的?? 如果是这样,那么您只需要从 ArrayList 中获取值,然后借助 setOnItemClickListener 中的 position 属性首先传递给适配器,如下所示:

foodList.setOnItemClickListener(new OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

            view.setBackgroundColor(Color.GREEN);

            String text = dishes.get(position);
            // do what you want to do with this value.

        
    );

【讨论】:

当我把你的线路放在那里时,现在我得到一个 NumberFormatException 并保留其余代码。但是我现在设法获得了正确的价值。 @Heiki - 上述解决方案仅用于获取您的 STRING VALUE ,如果您将 string(eg:"pudding 8") 转换为整数,它会给您该异常。如果您只需要整数值而不是告诉我,我可以帮助您。 text.replaceAll("[^\\d.]", "");对我不起作用。我用 String str = text.substring(text.indexOf(" ")); int num = Integer.parseInt(str.trim());不漂亮,但它有效。【参考方案2】:

像这样改变你的 onClickListener():

foodList.setOnItemClickListener(new OnItemClickListener() 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

        view.setBackgroundColor(Color.GREEN);
        String text = (String)parent.getItemAtPosition(position);
        text.replaceAll("[^\\d.]", "");
        int num = Integer.parseInt(text);
        total += num;
    
);

或者您可以使用SimpleAdapter 在单独的xml 布局中使用两个文本视图分别显示字符串和整数值。使用它,您可以更好地获取 onclick() 的值。

【讨论】:

【参考方案3】:

您需要获取该特定视图的文本,view.getText().toString();

foodList.setOnItemClickListener(new OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

            view.setBackgroundColor(Color.GREEN);
            String text = view.getText().toString();
            text.replaceAll("[^\\d.]", "");
            int num = Integer.parseInt(text);
            total += num;
        
    );

【讨论】:

你不能在视图上调用 .getText(),你只能用 textViews 来做。【参考方案4】:

这可能对你有帮助,但这是不好的方式:

foodList.setOnItemClickListener(new OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

            String item = (String) arrayAdapter.getItem(position);
            String[] split = item.split(" ");
            int num = Integer.parseInt(split[1]);
            total += num;
        
    );

但是很冲动……

对于我来说,你需要扩展适配器,将你的自定义项目收集到其中,点击后获取它并获取你需要的整数值。

【讨论】:

【参考方案5】:

我知道这可能为时已晚,但希望如此 帮助正在寻找具有多个值的自定义 ArrayAdapter 的类似解决方案的人。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

            ListItems item = (ListItems) parent.getItemAtPosition(position);
            System.out.println("Item: "+item.getName());
        
    );

【讨论】:

以上是关于如何访问由 arrayadapter 生成的列表视图项的主要内容,如果未能解决你的问题,请参考以下文章

ArrayAdapter的使用

如何实现 Asynctask 在 ArrayAdapter 中加载图像

ArrayAdapter.NotifyDataSetChanged() 不工作?

如何使用 SQLite 中的数据实现自定义 ArrayAdapter

如何在 listView Xamarin Android 中使用具有多个 Textview 列的 ArrayAdapter

文本过滤后从 Android ListView/ArrayAdapter 中删除项目不起作用