我有一个自定义列表视图,这是它的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?
答案 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
}