我有一个ListView,它是从SimpleCursorAdapter填充的,每行包含3个不同的TextViews。我只想用TextViewsViewBinder)修改所有行的R.id.text65之一,但是它会不断更新每行的所有3 TextViews。这是我的代码:

cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            sign = (TextView) view;
            SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String currency1 = currency.getString("Currency", "$");
                    sign.setText(currency1);

                    return true;
        }
    });


附言我尝试了(TextView) findViewById(R.id.text65);并且得到了Force close

最佳答案

解决方案1:

您应该检查viewbinder中的列索引:

       public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
           if (columnIndex == cursor.getColumnIndexOrThrow(**??**)) // 0 , 1 , 2 ??
            {
               sign = (TextView) view;
               SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
                String currency1 = currency.getString("Currency", "$");
                    sign.setText(currency1);

                    return true;
             }
             return false;
        }


注意,列索引是货币的DBcolumn索引/无论数据源如何,列的索引。

解决方案2:

您可能正在定义int[]以便绑定到listview中的字段,例如:

            // and an array of the fields we want to bind those fields to
    int[] to = new int[] { R.id.field1, R.id.field2, R.id.Currency };

    SimpleCursorAdapter entries = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);


...有条件地,您可以简单地传递0而不是您不想绑定/显示的字段的布局ID。

            int[] to = new int[] { 0, 0, R.id.Currency };


这样,将仅绑定“货币”字段。



另外,您之所以难以接近,是因为从技术上讲,您的contentView中没有单个text65,而是许多。您不能从主布局级别访问它。它仅在单行范围内是唯一的。



更新:

解决方案3:

id中检查视图的ViewBinder

    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        int viewId = view.getId();
        Log.v("ViewBinder", "columnIndex=" + columnIndex + " viewId = " + viewId);
        if(viewId == R.id.text65)
        {
            sign = (TextView) view;
            SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String currency1 = currency.getString("Currency", "$");
            sign.setText(currency1);

            return true;
         }
         return false;
     }


你可以试试这个吗?

有用的提示:您可以使用Log.v来检查代码中的某些值,而不必对其进行调试。

希望能帮助到你。

关于android - ViewBinder仅修改所有ListView行中的一项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9388283/

10-08 21:14