(Android)如何访问和修改自定义列表视图中的特定元素,因为它使用自定义适配器?

时间:2014-07-27 23:23:37

标签: android android-listview android-arrayadapter

我有一个自定义列表视图,这是它的layout.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:id="@+id/playerToken"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/playerName"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/playerMoney"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

这是自定义适配器,它接受一个Player对象的数组,该对象存储玩家姓名,代表他的令牌和他的余额等信息。适配器获取该信息并填充我的自定义列表,如上面的布局。

public class MyAdapter extends ArrayAdapter<Player> {

    public MyAdapter(Context context, Player[] values) {

        super(context, R.layout.activity_banking_layout, values);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater theInflater = LayoutInflater.from(getContext());

        View theView = theInflater.inflate(R.layout.activity_banking_layout, parent, false);

        Player player = getItem(position);

        TextView playerNameText = (TextView) theView.findViewById(R.id.playerName);
        TextView playerMoneyText = (TextView) theView.findViewById(R.id.playerMoney);
        ImageView playerToken = (ImageView) theView.findViewById(R.id.playerToken);

        playerNameText.setText(player.getName());
        playerMoneyText.setText(Integer.toString(player.getMoney()));


        int rId = theView.getResources().getIdentifier(player.getToken(), "drawable",
                                                       getContext().getPackageName());
        playerToken.setImageResource(rId);

        return theView;
    }
}

这只是显示我们正在调整的listView的布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/bankListView" />

</LinearLayout>

所以基本上,我的列表是在显示列表的活动的onCreate方法中创建和适配器的。之后我的列表项可以打开上下文菜单,并根据选择的内容操纵播放器对象。我希望我的列表能够反映这些变化,所以我想知道如何访问自定义列表的特定部分并进行编辑。例如,我的自定义列表有一个玩家图标,在右边,玩家名称和名称下面有一个金额。假设我想更改特定播放器的金额并在列表中反映该更改,如何在该ListView中的特定位置访问该特定TextView?

3 个答案:

答案 0 :(得分:3)

由于您的适配器&#39; MyAdapter&#39;扩展ArrayAdapter,您可以尝试使用getItem(int position)返回指定位置的列表项;你的案件中有Player个对象。在那里,您可以修改对象的数据成员(金额),然后刷新列表以反映notifyDataSetChanged()的更改。

如果您想知道所点击列表项的索引/位置,那么您的问题将与此one重复。

答案 1 :(得分:1)

而不是操纵textview,请考虑以下方法:

使Player []数组成为全局变量,而不是将其传递给构造函数。然后直接操纵Player对象,然后调用 notifyDataSetChanged() 在您的适配器上,它将自动更新您正确的文本视图。

private Player[] values;

public void onCreate(Bundle s){
     /*your onCreate things*/

     MyAdapter adapter = new MyAdapter(this);

     // update player 5 from array
     values[4].money = newMoneyVal;

     // after updating, call notifyDataSetChanged()
     adapter.notifyDataSetChanged();
}

public class MyAdapter extends ArrayAdapter<Player> {

    public MyAdapter(Context context) {

        super(context, R.layout.activity_banking_layout, values);

    }

    /*rest of your adapter class*/
}

告诉我这是否有效或者您有任何问题

答案 2 :(得分:0)

Yuo只需要实现一个onlistitemclick监听器,如下所示:

@Override
protected void onListItemClick(ListView l, View v, int pos, long id) {
    super.onListItemClick(l, v, pos, id);
    l[pos].findViewById(R.id.yourTagName).setText("ChangedValue");//to be adapted
}